/*******************************************************************************
* Copyright (c) 2008 EchoStar Technologies Corporation
* All Rights Reserved
* Confidential Property of EchoStar Technologies Corporation
*
* THE MATERIAL CONTAINED HEREIN MAY ONLY BE USED SUBJECT TO AN EXECUTED
* AGREEMENT BETWEEN THE USER AND ECHOSTAR TECHNOLOGIES CORPORATION.
* DISCLOSURE OF THIS MATERIAL IS STRICTLY PROHIBITED EXCEPT SUBJECT TO
* THE TERMS OF SUCH AN AGREEMENT.
*
* $Workfile: $
*  PVCS_REV:   1.00  $
* $Revision: 1.23 $
* $Author: yelavik $
* $Date: 2008/11/05 18:22:35 $
*******************************************************************************/

/**
* \file   main.js
* \author Trey White
* \date   11-21-2008
*
* \brief  This file contains Javascript functionality throughout the system
*
*/

/***************************************************************************
*
* Entry Points: 	N/A
*
*****************************************************************************/

/****************************
 *     COOKIE FUNCTIONS     *
 ****************************/
 
function isUserLoggedIn() {
	return (getCookie("manSession")!='');
}

function SelfcareLogout( domain ) {
	var expiredDate = new Date();
	expiredDate.setMonth(-1);
	setCookie("manSession"," ",expiredDate,"/",domain);
	window.location = "http://secure.dishonline.com/Selfcare/default.aspx?navGraph=Logout&returnUrl=http://www.dishonline.com" ;
}


function getCookie(name) {
	var dc = document.cookie;
	var prefix = name + "=";
	var begin = dc.indexOf("; " + prefix);
	if (begin == -1)
	{
		begin = dc.indexOf(prefix);
		if (begin != 0) return '';
	}
	else
	{
		begin += 2;
	}
	var end = document.cookie.indexOf(";", begin);
	if (end == -1)
	{
		end = dc.length;
	}
	//alert(name + ": " + unescape(dc.substring(begin + prefix.length, end)));
	return unescape(dc.substring(begin + prefix.length, end));	
}

function setCookie(name, value, expires, path, domain, secure) {
  		document.cookie = name + "=" + escape(value) +
      	((expires) ? "; expires=" + expires.toGMTString() : "") +
      	((path) ? "; path=" + path : "") +
      	((domain) ? "; domain=" + domain : "") +
      	((secure) ? "; secure" : "");
}

function delCookie (name) {
    var expireNow = new Date();
    document.cookie = name + "=" +
    "; expires=Thu, 01-Jan-70 00:00:01 GMT" +  "; path=/";
}
    
  


/**************************
 *     MENU FUNCTIONS     *
 **************************/
 
var timeout	= 500;
var closetimer	= 0;
var ddmenuitem	= 0;

// open hidden layer
function mopen(id) {	
	// cancel close timer
	mcancelclosetime();

	// close old layer
	if(ddmenuitem) ddmenuitem.style.visibility = 'hidden';

	// get new layer and show it
	ddmenuitem = document.getElementById(id);
	ddmenuitem.style.visibility = 'visible';
	ddmenuitem.style.zIndex='30';
}

// close showed layer
function mclose() {
	if(ddmenuitem) ddmenuitem.style.visibility = 'hidden';
}

// go close timer
function mclosetime() {
	closetimer = window.setTimeout(mclose, timeout);
}
	
// cancel close timer
function mcancelclosetime() {
	if(closetimer) {
		window.clearTimeout(closetimer);
		closetimer = null;
	}
}

// close layer when click-out
//document.onclick = mclose; 



/*********************************
 *     ADOBE FLASH FUNCTIONS     *
 *********************************/
function AC_AddExtension(src, ext)
{
  if (src.indexOf('?') != -1)
    return src.replace(/\?/, ext+'?'); 
  else
    return src + ext;
}

function AC_Generateobj(objAttrs, params, embedAttrs) 
{ 
  var str = '<object ';
  for (var i in objAttrs)
    str += i + '="' + objAttrs[i] + '" ';
  str += '>';
  for (var i in params)
    str += '<param name="' + i + '" value="' + params[i] + '" /> ';
  str += '<embed ';
  for (var i in embedAttrs)
    str += i + '="' + embedAttrs[i] + '" ';
  str += ' ></embed></object>';

  document.write(str);
}

function AC_FL_RunContent(){
  var ret = 
    AC_GetArgs
    (  arguments, ".swf", "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
     , "application/x-shockwave-flash"
    );
  AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
}

function AC_SW_RunContent(){
  var ret = 
    AC_GetArgs
    (  arguments, ".dcr", "src", "clsid:166B1BCA-3F9C-11CF-8075-444553540000"
     , null
    );
  AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
}

function AC_GetArgs(args, ext, srcParamName, classid, mimeType){
  var ret = new Object();
  ret.embedAttrs = new Object();
  ret.params = new Object();
  ret.objAttrs = new Object();
  for (var i=0; i < args.length; i=i+2){
    var currArg = args[i].toLowerCase();    

    switch (currArg){	
      case "classid":
        break;
      case "pluginspage":
        ret.embedAttrs[args[i]] = args[i+1];
        break;
      case "src":
      case "movie":	
        args[i+1] = AC_AddExtension(args[i+1], ext);
        ret.embedAttrs["src"] = args[i+1];
        ret.params[srcParamName] = args[i+1];
        break;
      case "onafterupdate":
      case "onbeforeupdate":
      case "onblur":
      case "oncellchange":
      case "onclick":
      case "ondblClick":
      case "ondrag":
      case "ondragend":
      case "ondragenter":
      case "ondragleave":
      case "ondragover":
      case "ondrop":
      case "onfinish":
      case "onfocus":
      case "onhelp":
      case "onmousedown":
      case "onmouseup":
      case "onmouseover":
      case "onmousemove":
      case "onmouseout":
      case "onkeypress":
      case "onkeydown":
      case "onkeyup":
      case "onload":
      case "onlosecapture":
      case "onpropertychange":
      case "onreadystatechange":
      case "onrowsdelete":
      case "onrowenter":
      case "onrowexit":
      case "onrowsinserted":
      case "onstart":
      case "onscroll":
      case "onbeforeeditfocus":
      case "onactivate":
      case "onbeforedeactivate":
      case "ondeactivate":
      case "type":
      case "codebase":
        ret.objAttrs[args[i]] = args[i+1];
        break;
      case "width":
      case "height":
      case "align":
      case "vspace": 
      case "hspace":
      case "class":
      case "title":
      case "accesskey":
      case "name":
      case "id":
      case "tabindex":
        ret.embedAttrs[args[i]] = ret.objAttrs[args[i]] = args[i+1];
        break;
      default:
        ret.embedAttrs[args[i]] = ret.params[args[i]] = args[i+1];
    }
  }
  ret.objAttrs["classid"] = classid;
  if (mimeType) ret.embedAttrs["type"] = mimeType;
  return ret;

}


/***************************
 *     OTHER FUNCTIONS     *
 ***************************/

function bodyLoad() {
	var loginForm = document.getElementById("frmLogin");
	if (isUserLoggedIn()) {
		loginForm.style.display="none";
	} else {
		loginForm.style.display="block";
		adjustLoginAlignment();
	}
}
    
function adjustLoginAlignment() {
	//var loginForm = document.getElementById("frmLogin");
	//var positioner = document.getElementById("resizeAlignmentPoint");
	//loginForm.style.left = findPosX(positioner);
}
    
function findPosX(obj) {
	var curleft = 0;
	if(obj.offsetParent)
		while(1) {
			curleft += obj.offsetLeft;
			if(!obj.offsetParent)
				break;
			obj = obj.offsetParent;
		}
	else if(obj.x)
		curleft += obj.x;

	return curleft;
}

function findPosY(obj) {
	var curtop = 0; 
	if(obj.offsetParent)
		while(1) {
			curtop += obj.offsetTop;
			if(!obj.offsetParent)
				break;
			obj = obj.offsetParent;
		}
	else if(obj.y)
		curtop += obj.y;

	return curtop;
}  


/********************************
 *     VALIDATION FUNCTIONS     *
 ********************************/

function validate_form(theForm) {
	
	var retVal = false;
	var arrayCheck = new Array();
	
	switch(theForm.name) {
		case "new_subscribers_form":
			// No validation for this form... it's okay to submit
			retVal = true;
			break;
		case "existing_subscribers_form":
			arrayCheck[0] = email_validator(theForm.emailAddress.value, "existing_subscriber_email");
			arrayCheck[1] = password_validator(theForm.password.value, 'existing_subscriber_password');
			
			retVal = array_validator(arrayCheck);
			break;
		case "forgot_password_form":
			if(email_validator(theForm.email_address.value, "forgot_email")) {
				retVal = true;
			}
			break;
		case "password_reset":
			arrayCheck[0] = password_validator(theForm.password.value, 'reset_password');
			arrayCheck[1] = password_validator(theForm.password2.value, 'reset_password2');
			arrayCheck[2] = password_match_validator(theForm.password.value, theForm.password2.value, 'reset_password2');
			
			retVal = array_validator(arrayCheck);
			break;
		case "registration_form":
			arrayCheck[0] = alpha_numeric_validator(theForm.firstName.value, 'name', 'register_first_name');
			arrayCheck[1] = alpha_numeric_validator(theForm.lastName.value, 'name', 'register_last_name');
			arrayCheck[2] = email_validator(theForm.emailAddress.value, 'register_email');
			arrayCheck[3] = date_validator(theForm.birthdate.value, 'register_birthdate');
			arrayCheck[4] = password_validator(theForm.password.value, 'register_password');
			arrayCheck[5] = password_validator(theForm.password2.value, 'register_password2');
			arrayCheck[6] = numeric_validator(theForm.contactPhoneNumber.value, 'Contact Phone Number', 10 , 'register_phone_number', 'Please enter a valid 10-digit Phone Number (Numbers ONLY).');
			arrayCheck[7] = numeric_validator(theForm.zipCode.value, 'Zip Code', 5 , 'register_zip_code', 'Please enter a valid 5-digit ZIP Code.');
			arrayCheck[8] = password_match_validator(theForm.password.value, theForm.password2.value, 'register_password2');

			retVal = array_validator(arrayCheck);
			break;
		case "change_account_form":
			arrayCheck[0] = alpha_numeric_validator(theForm.firstName.value, 'name', 'register_first_name');
			arrayCheck[1] = alpha_numeric_validator(theForm.lastName.value, 'name', 'register_last_name');
			arrayCheck[2] = email_validator(theForm.emailAddress.value, 'register_email');
			arrayCheck[3] = password_validator(theForm.password.value, 'register_password');
			arrayCheck[4] = password_validator(theForm.password2.value, 'register_password2');
			arrayCheck[5] = password_match_validator(theForm.password.value, theForm.password2.value, 'register_password2');

			retVal = array_validator(arrayCheck);
			break;
		case "change_preferences_form":
			arrayCheck[0] = numeric_validator(theForm.contactPhoneNumber.value, 'Contact Phone Number', 10 , 'register_phone_number', 'Please enter a valid 10-digit Phone Number (Numbers ONLY).');
			arrayCheck[1] = numeric_validator(theForm.zipCode.value, 'Zip Code', 5 , 'register_zip_code', 'Please enter a valid 5-digit ZIP Code.');

			retVal = array_validator(arrayCheck);
			break;
		default:
	}

	return retVal;
}


function email_validator(email, updateSpan) {
	
	var retVal = false;
	
	var email_regex = /^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i;
	
	if(!email.search(email_regex)) {
		document.getElementById(updateSpan).innerHTML = '';
		retVal = true;
	} else if(!email.length) {
		document.getElementById(updateSpan).innerHTML = '<span class="redError">Please enter your email address.</span>';
	} else {
		document.getElementById(updateSpan).innerHTML = '<span class="redError">Please enter a proper email address, for example joe@example.com</span>';
	}

	return retVal;
}

function password_validator(password, updateSpan) {
	
	var retVal = false;
	
	var password_regex = /^[^\s&$'<>".*`\/\\]{6,18}$/;
	
	if(!password.search(password_regex)) {
		document.getElementById(updateSpan).innerHTML = '';
		retVal = true;
	} else if(!password.length) {
		document.getElementById(updateSpan).innerHTML = '<span class="redError">Please enter your password.</span>';
	} else {
		document.getElementById(updateSpan).innerHTML = '<span class="redError">Please enter a password with 6-18 characters. Spaces and &<> and some other special characters are not allowed.</span>';
	}
	
	return retVal;
}

function alpha_numeric_validator(field, descriptor, updateSpan) {
	
	var retVal = false;
	
	var field_regex = /([a-zA-Z0-9_-]+)$/;
	
	if(!field.search(field_regex)) {
		document.getElementById(updateSpan).innerHTML = '';
		retVal = true;
	} else if(!field.length) {
		document.getElementById(updateSpan).innerHTML = '<span class="redError">Please enter your ' + descriptor + '.</span>';
	} else {
		document.getElementById(updateSpan).innerHTML = '<span class="redError">Special characters are not permitted.</span>';
	}
	
	return retVal;
}

function date_validator(field, updateSpan) {
	
	var retVal = false;
	
	var field_regex = /^(\d{2})(\/|\.|\-)(\d{2})\2([1-2]\d{3})$/;
        var date_values;

        date_values = field.match(field_regex);
        // date_values[0] matches string if the format is correct
        // date_values[1] is month
        // date_values[3] is day
        // date_value[4] is year
	
	if( date_values != null ) {
            // Test for good month values
            if ( (date_values[1] < 1) || (date_values[1] > 12) )
            {
		document.getElementById(updateSpan).innerHTML = '<span class="redError">Invalid month value</span>';
		return retVal;
            }

            // Test for good day values    
            var Month31Ex = /01|03|05|07|08|10|12/ ;
            if ( Month31Ex.test(date_values[1]) )
            {
              if ( date_values[3] > 31 )
              {
		document.getElementById(updateSpan).innerHTML = '<span class="redError">Invalid day value</span>';
		return retVal;
              }
            }
            else if ( date_values[1] == "02" )
            {
              if ( date_values[3] > 29 )
              {
		document.getElementById(updateSpan).innerHTML = '<span class="redError">Invalid day value</span>';
		return retVal;
              }
              else if ( date_values[3] == 29 )
              {
                 // Leap Year Testing (must be divisible by 4 for most years except those divisible by 100 but not by 400)
                 // I am not adding those calculation to this since 2100 is next time that happens
                 if ( (date_values[4] % 4) != 0 )
                 {
		    document.getElementById(updateSpan).innerHTML = '<span class="redError">Invalid day value</span>';
		    return retVal;
                 }
              }
              else 
              {
                 // Day less than 29 - day is okay
              }
            }    
            else 
            {
              if ( date_values[3] > 30 )
              {
		document.getElementById(updateSpan).innerHTML = '<span class="redError">Invalid day value</span>';
		return retVal;
              }
            }     

		document.getElementById(updateSpan).innerHTML = '';
		retVal = true;
	} else {
		document.getElementById(updateSpan).innerHTML = '<span class="redError">Please enter your birthday using mm/dd/yyyy format, for example \'06/16/1979\'</span>';
	} 
	
	return retVal;
}

function numeric_validator(field, descriptor, length, updateSpan, error) {
	
	var retVal = false;
	
	if(!isNaN(field) && field.length == length) {
		document.getElementById(updateSpan).innerHTML = '';
		retVal = true;
	} else if(!field.length) {
		document.getElementById(updateSpan).innerHTML = '<span class="redError">' + descriptor + ' required</span>';
	} else {
		document.getElementById(updateSpan).innerHTML = '<span class="redError">' + error + '</span>';
	}
	
	return retVal;
}

function password_match_validator(password1, password2, updateSpan) {
	
	var retVal = false;
	
	if(password1 == password2) {
		document.getElementById(updateSpan).innerHTML = '';
		retVal = true;
	} else {
		document.getElementById(updateSpan).innerHTML = '<span class="redError">The password and password confirm fields need to be identical, please enter those fields again.</span>';		
	}
	
	return retVal;
}

function array_validator(theArray) {
	
	var retVal = false;
	
	var errorFlag = false;
	for(var i in theArray) {
		if(!theArray[i]) {
			errorFlag = true;
		}
	}
	
	if(!errorFlag) {
		retVal = true;
	}
	
	return retVal;
}

