// JScript File


/*********************
  V
*********************/

function V(obj,type)
{
	var def;
	var o=$(obj);
	if (o)
	{	
	    if (o.checked)
	        def = o.checked
	    else
	        def= o.value;
	}
	
		
	switch(type)
	{
	    case "String":
	        if (def.indexOf('<')==0) def = encodeURI(def);
	        def=String(def);
	    break;
	    case "Boolean":
	        if (def==true || def=='true' || def==1 || def=="on")
	            def=true;
	         else
	            def=false;
	    break;
	    case "Double":
	        def=parseFloat(def);
	        def=parseFloat(def+"0.00000000001");
	    break;
	    case "Int16":
	    case "Int64":
	    case "Int32":
	        if (def)
	            def=def * 1;
	    break;
	}
    return def;
}


/*********************
  getElementsByClassName
*********************/
/*	Written by Jonathan Snook, http://www.snook.ca/jonathan
	Add-ons by Robert Nyman, http://www.robertnyman.com */
function getElementsByClassName(oElm, strTagName, strClassName){
    var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
    var arrReturnElements = new Array();
    strClassName = strClassName.replace(/\-/g, "\\-");
    var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
    var oElement;
    for(var i=0; i<arrElements.length; i++){
        oElement = arrElements[i];      
        if(oRegExp.test(oElement.className)){
            arrReturnElements.push(oElement);
        }   
    }
    return (arrReturnElements)
}


/*********************
  string handling
*********************/

function trim(str) {
  return str.replace(/^\s*|\s*$/g,"");
}


/*********************
  characters
*********************/
g_charCodes = {
	HOME : 36,
	LEFT_ARROW : 37,
	RIGHT_ARROW : 39,
	DELETE : 46
}

//document.onkeyup = checkKeycode
function checkKeycode(e) {
	var keycode;
	if (window.event) keycode = window.event.keyCode;
	else if (e) keycode = e.which	;
	
}


/*********************
  cookie handling
*********************/

function getCookie(cookieName) {
	var strResults = new String();
	var offset = 0;
	var end = 0;
	var strSearch = new String(cookieName) + "=";
	if (document.cookie.length > 0) {
		offset = document.cookie.indexOf(strSearch);
		if (offset != -1) {
			offset += strSearch.length;
			end = document.cookie.indexOf(";", offset);
			if (end == -1) {
				end = document.cookie.length;
			}
			strResults = unescape(document.cookie.substring(offset, end));
		}
	}
	return strResults;
}


/*********************
  validation
*********************/

// If text field is empty or has only whitespace
function whiteSpaceOnly(val) {
	var s = new String(val);
	var re = /^\s+$/; // matches strings of all whitespace chars

	if (s.match(re) || s == "") {
		return true;
	}
	else {
		return false;
	}
}


function isValidCreditCard(typeField,numberField,ccExpMonthField,ccExpYearField,
                           ccMemberNameField,ccSecurityField,errorField,errorMessage)
{

   var cardType = typeField.value;
   var cardNumber = numberField.value;
   
   var isValid = true;
   if (isValid)
   {
     var cardNumbersOnly = cardNumber.replace(/ /g,"");
     numberField.value = cardNumbersOnly; /* strip the spaces out of the field */
     
     var cardNumberLength = cardNumbersOnly.length;
     var securityNumLength = 3;
     var lengthIsValid = false;
     var prefixIsValid = false;
     var prefixRegExp;
     switch(cardType)
     {     
       case "MC":
         lengthIsValid = (cardNumberLength == 16);
         prefixRegExp = /^5[1-5]/;
         securityNumLength = 3;
         break;
       case "VISA":
         lengthIsValid = (cardNumberLength == 16 || cardNumberLength == 13);
         prefixRegExp = /^4/;
         securityNumLength = 3;
         break;
       case "AMEX":
         lengthIsValid = (cardNumberLength == 15);
         prefixRegExp = /^3(4|7)/;
         securityNumLength = 4;
         break;
       case "DISC":
         lengthIsValid = (cardNumberLength == 16);
         prefixRegExp = /^6011/;
         securityNumLength = 3;
         break;
       default:
         lengthIsValid = (cardNumberLength == 16);
         securityNumLength = 3;
         prefixRegExp = /^$/;

     }
     //alert(!isNaN(ccSecurityField.value));
     //alert(ccSecurityField.value);
     prefixIsValid = prefixRegExp.test(cardNumbersOnly);     
     isValid = prefixIsValid && lengthIsValid && 
        (ccSecurityField.value.length == securityNumLength) && !isNaN(ccSecurityField.value);
   }
   if (isValid)
   {
     var numberProduct;
     var numberProductDigitIndex;
     var checkSumTotal = 0;
     for (digitCounter = cardNumberLength - 1;
       digitCounter >= 0;
       digitCounter--)
     {
       checkSumTotal += parseInt (cardNumbersOnly.charAt(digitCounter));
       digitCounter--;
       numberProduct = String((cardNumbersOnly.charAt(digitCounter) * 2));
       for (var productDigitCounter = 0;
         productDigitCounter < numberProduct.length;
         productDigitCounter++)
       {
         checkSumTotal +=
           parseInt(numberProduct.charAt(productDigitCounter));
       }
     }
     isValid = (checkSumTotal % 10 == 0);
   }
   
   
	showHideError(isValid,typeField,errorField,errorMessage); 
		
   return isValid;
}

function isValidField(field, err_field, msg) {
	var isValid = true;
	if ( whiteSpaceOnly(field.value) ) {		
		isValid = false;		
	}
	
	showHideError(isValid,field,err_field,msg);
	return isValid;
}


function isValidEmailHelper(str) {
	// check that regular expressions are supported
	var bSupported = 0;
	if (window.RegExp) {
		var tempStr = "a";
		var tempReg = new RegExp(tempStr);
		if (tempReg.test(tempStr)) {
			bSupported = 1;
		}
	}
	if (!bSupported) {
		return (str.indexOf(".") > 2) && (str.indexOf("@") > 0);
	}

	// special check for disney
	if ( str.match('@photopass.com') ) {
		return false;
	}
	var re = /^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$/;

	return re.test(str);
}


function isValidEmail(field, err_field, msg) {
	var isValid = isValidEmailHelper(field.value);		
	showHideError(isValid,field,err_field,msg);
	return isValid;
}

function isValidSelect(field, err_field, msg) {
	var isValid = true;
	if ( field.value == 'select' || field.value == 'Select' || field.value == '') {
		isValid = false;
	}	
	showHideError(isValid,field,err_field,msg);
	return isValid;
}

function isValidZip(field,err_field,msg)
{
    var value = field.value;            
    reZip = new RegExp(/(^\d{5}$)|(^\d{5}-\d{4}$)/);
    var isValid = reZip.test(value);
    showHideError(isValid,field,err_field,msg);
    return isValid;
}

function isValidZipPlus4(field,err_field,msg)
{
    var value = field.value;
    var oRegExp = new RegExp("[0-9](4)");
    var isValid = oRegExp.test(value);
    showHideError(isValid,field,err_field,msg);
    return isValid;
}

function isValidPhone(field,err_field,msg)
{
	var value = field.value;
	var oRegExp = /^((\+\d{1,3}(-| )?\(?\d\)?(-| )?\d{1,3})|(\(?\d{2,3}\)?))(-| )?(\d{3,4})(-| )?(\d{4})(( x| ext| ext\.| ext\. )\d{1,5}){0,1}$/;
	/* 
	The phone number regular expression accepts phone number in both 
	local format (eg. 02 1234 5678 or 123 123 4567) or international 
	format (eg. +61 (0) 2 1234 5678 or +1 123 123 4567). It also accepts 
	an optional extention of up to five digits prefixed by x or 
	ext (eg. 123 123 4567 x89); and several different seperators.
	*/	
	var isValid = oRegExp.test(value);
	this.showHideError(isValid,field,err_field,msg);
	return isValid;
}

function showHideError(isValid,field,err_field,msg)
{
  if(!isValid){
        displayError(field,err_field,msg);
    }    
    else
    {
        clearError(err_field)
    }
}

function displayError(field,err_field,msg) {
	err_field.innerHTML = msg;	
	err_field.style.display = 'block';	
	return false;
}

function clearError(err_field) {
	err_field.innerHTML = '';
	err_field.style.display = 'none';	
	return false;
}

function clearErr(elem) {
	if (! whiteSpaceOnly(elem.value) ) {
		$('err_' + elem.id).innerHTML = '';
		$('err_' + elem.id).style.display = 'none';
	}
}

function clearErrValue(error) {
	$(error).innerHTML = '';
	$(error).style.display = 'none';
}

function clearErrMatch(elem,elemMatchId,bCaseSensitive) {
	if ( bCaseSensitive && (elem.value == $F(elemMatchId)) || (elem.value.toLowerCase() == $F(elemMatchId).toLowerCase()) ) {
		$('err_' + elem.id).innerHTML = '';
		$('err_' + elem.id).style.display = 'none';
	}
}


function autoFocus(field, limit, nextel, evt) {
	var next = document.getElementById(nextel);

	if (next) {
		evt = (evt) ? evt : event;
		var charCode = (evt.charCode) ? evt.charCode : ((evt.keyCode) ? evt.keyCode : ((evt.which) ? evt.which : 0));
		if ( charCode > 31 && field.value.length == limit && 
			!(charCode==g_charCodes.HOME || charCode==g_charCodes.LEFT_ARROW || charCode==g_charCodes.RIGHT_ARROW || charCode==g_charCodes.DELETE) ){
			next.focus( );
		}
	}

	return false;
}



/*********************
  querystring
*********************/
function QueryString(key){
	var value = null;
	for (var i=0;i<QueryString.keys.length;i++)	{
		if (QueryString.keys[i]==key)		{
			value = QueryString.values[i];
			break;
		}
	}
	return value;
}

function QueryString_Parse(){
	var query = window.location.search.substring(1);
	var pairs = query.split("&");

	for (var i=0;i<pairs.length;i++)	{
		var pos = pairs[i].indexOf('=');
		if (pos >= 0)		{
			var argname = pairs[i].substring(0,pos);
			var value = pairs[i].substring(pos+1);
			QueryString.keys[QueryString.keys.length] = argname;
			QueryString.values[QueryString.values.length] = value;
		}
	}
}

// parse the querystring for info
QueryString.keys = new Array();
QueryString.values = new Array();
QueryString_Parse();





/*********************
  for cart
*********************/
function formatCurrency(num)
{
	num = num.toString().replace(/\$|\,/g,'');
	if(isNaN(num))
	num = "0";
	sign = (num == (num = Math.abs(num)));
	num = Math.floor(num*100+0.50000000001);
	cents = num%100;
	num = Math.floor(num/100).toString();
	if(cents<10)
	cents = "0" + cents;
	for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
	num = num.substring(0,num.length-(4*i+3))+','+
	num.substring(num.length-(4*i+3));
	return (((sign)?'':'-') + '$' + num + '.' + cents);
}

function disableForm(theform,disabled) {
if (document.all || document.getElementById) {
	for (i = 0; i < theform.length; i++) {
	var formElement = theform.elements[i];
		if (true) {
			formElement.disabled = disabled;
	}}}}


/*********************
  Form Validation
*********************/


function DebugWrite(msg)
{
    if($(debugWindow) != null &&
       $(debugTextArea) != null)
    {
        $(debugTextArea).value = "debugTextArea\n" + $(debugTextArea).value;
    }
}

function ShowDebugWindow(show)
{
    if($(debugWindow) != undefined)
    {
        $(debugWindow).style.display = (show) ? block : none;
    }
    else
    {
        alert('You must define a div called debugWindow and a text area called debugTextArea to use this function.');
    }
}


/*********************
  pop-over divs
*********************/
function doPopover(sId, sTitle, sContent){

	if ( typeof($(sId)) == 'undefined' ) {	// create it
		var s = '';
		s+='<div id="' + sId + '" class="popover">\n';
		s+='<div class="dialog">\n';
		s+='<div class="hd"><div class="close"><img src="' + closebtn.src + '" border="0" alt="Close" onclick="return doModalEnd(\'' + sId + '\');" onmouseover="this.src=closebtn_on.src;" onmouseout="this.src=closebtn.src;" /></div></div>\n';
		s+='<div class="bd">\n';
		s+='<div class="c">\n';
		s+='<div class="s">\n';
		s+='<div class="title">' + sTitle + '</div>\n';
		s+= sContent;
		s+='</div>\n';
		s+='</div>\n';
		s+='<div class="ft"><div class="c"></div></div>\n';
		s+='</div>\n';
		s+='</div>\n';
		s+='</div>\n';

		var popopver = document.createElement('div');
		//popopver.setAttribute('id',sId );
		popopver.innerHTML = s;

		//$('content').appendChild(popopver);
		var objBody = document.getElementsByTagName("body").item(0); // needs to be on the body so it doesn't get hidden
		objBody.appendChild(popopver);

		// for Y drag n drop, not using
		//var dd1 = new YAHOO.util.DD(sId);
	}

	doModal(sId);

	return false;
}

function doModal(popupId) {

	hideSelectBoxes();

	// create it
	if ( typeof($('modal')) == 'undefined' ) {
		var objBody = document.getElementsByTagName("body").item(0);
		var modalOverlay = document.createElement("div");
		modalOverlay.setAttribute('id','modal');
		modalOverlay.style.display = 'none';
		modalOverlay.onclick = function() { return false; }	// disable clicks
		objBody.appendChild(modalOverlay);
	}

	// get page size and scroll
	var arrayPageSize = getPageSize();
	var arrayPageScroll = getPageScroll();

	// stretch overlay to fill page and fade in
	Element.setHeight('modal', arrayPageSize[1]);

	// do modal effect
	new Effect.Appear('modal', { duration: 0.2, from: 0.0, to: 0.8 });

	// calculate top offset for the dialog
	var boxTop = arrayPageScroll[1] + (arrayPageSize[3] / 15);
	Element.setTop(popupId, boxTop);

	// calculate left offset for the dialog
	var boxLeft = (arrayPageSize[2] - 500) / 2;
	Element.setLeft(popupId, boxLeft);

	// show it
	Element.show(popupId);

	return false;
}

function doModalEnd(popupId) {

	if (typeof($(popupId))!='undefined') {
		Element.hide(popupId);
	}

	new Effect.Fade('modal', { duration: 0.2});
	showSelectBoxes();

	return false;
}
