
/******************************************
  generic
******************************************/

function pleaseWait(btn, on, buttonValue){
	if (on) {
		if ($(btn)) {
				$(btn).disabled = true;
				$(btn).value = "Please Wait...";
		}
	}
	else {
		if ($(btn)) {
			$(btn).disabled = false;
			if ( typeof(buttonValue)!= "undefined" )
			    $(btn).value = buttonValue;
		}
	}
}

function removeElementChildren(element){
	var node;
	while((node = element.lastChild)){
		element.removeChild(node);
	}
}


var _canada = 'CAN';
var _usa = 'USA';


/*********************
  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;
}

function deleteToken() {
    var cookieName = 'ezpUserToken';
	deleteCookie(cookieName);
}

function deleteEncryptionToken() {
    var cookieName = 'ezpEncryptionToken';
	deleteCookie(cookieName);
}

function ExpireCookies() {
    //Get Cookies string
    var cookies = document.cookie;

    //Split String into Array of cookie name-value pairs
    var cookieArray = new Array();
    cookieArray = cookies.split(';');

    //Expire each cookie in array
    var i;
    for (i=0;i < cookieArray.length; i++)
    {
        var nameValuePair = cookieArray[i];
        var cookieName = nameValuePair.substring(0, nameValuePair.indexOf('='));

        deleteCookie(cookieName);
    }
}

function deleteCookie(cookieName) {
	var string = cookieName + "='';expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/;";
	document.cookie = string;
}

function getToken() {
	return getCookie('ezpUserToken');
}

function setToken(value) {
	setCookie('ezpUserToken',value);
}

function getEncryptionToken() {
	return getCookie('ezpEncryptionToken');
}

function setEncryptionToken(value) {
	setCookie('ezpEncryptionToken',value);
}

function setCookie(name, value) {
	document.cookie = name + '=' + value + '; path=/;';
}


// require login.js
function logOut()
{
	//deleteToken();
	//deleteEncryptionToken();
	ExpireCookies();

	var login = new Login();
	var onFail = function(response)
	{
		alert('Failed To Log Out');
	}

	var onSuccess = function(response)
	{
		document.location = '/';
	}

	login.logout(getToken(),onSuccess,onFail);
}



/*********************
  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 "ae":
         lengthIsValid = (cardNumberLength == 15);
         prefixRegExp = /^3(4|7)/;
         securityNumLength = 4;
         break;
       case "discover":
         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 IsValidPassword(field,err_field,msg)
{
    var value = field.value;
    var isValid = true;
    if (value.length < 6)
        isValid = false;
    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 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;
}


/******************************************
  navigable
******************************************/
var launchPhidget = function(productName, skuList, activeSku)
{
	var finalUrl = "";

	switch (productName.toLowerCase())
	{
	    /*
	    case "frame":
		{
		    finalUrl = "/Configurators/simple.aspx";
		}
		break;
		*/
		default:
		{
		    finalUrl = "/Configurators/advanced.aspx";
		}
		break;
	
	}

	finalUrl += "?productName=" + productName;
	if (skuList) finalUrl += "&skus=" + skuList;
	if( activeSku ) finalUrl += "&activeSku=" + activeSku;

	document.location = finalUrl;
	return false;
}


var launchProductBuilder = function(productName, activeSku, skuList)
{
    //var finalUrl = "/Configurators/ProductBuilder.aspx";
    var finalUrl = "/Configurators/advanced.aspx";
    
    if(productName == "Flat Cards") {
        finalUrl = "/configurators/advanced.aspx";
    }

	//private function
	var setDefaults = function(sku, skus)
	{
		if (typeof(activeSku)=="undefined" && typeof(sku)!="undefined")
		{
			activeSku = sku;
		}
		if (typeof(skuList)=="undefined"  && typeof(skus)!="undefined")
		{
			skuList = skus;
		}
	}

	// create some defaults, in case only the productName is passed in
	switch (productName.toLowerCase())
	{
	    case "mounted print": setDefaults('83007', '83007,83008,83013,83014,83019,83020,83025,83026,83031,83032'); break; 
		case "mounted print w/ hanging kit" : setDefaults('83004', '83004,83005,83011,83016,83017,83022,83023,83028,83029,83034'); break;
		case "eco notepad"   : setDefaults('74000', '74000,74001,74009'); break;
		case "eco cards"     : setDefaults('74003', '74003,74004'); break; 
		case "magnet"        : setDefaults('10195', '10195,10196,10400,10401,10402,10403,10404,10405,10406,10407,10408,10409'); break;
		case "tote bag"      : setDefaults('10185'); break;
		case "apron"         : setDefaults('10180'); break;
		case "photo jewelry": setDefaults('10600', '10600,10601,10602,10603,10604,10605,10606,10607,10608'); break;
		case "t-shirt"       : setDefaults('51104', '51104,51105,51106,51107,51108,51109,51110,51111,51200,51201,51202,51203,51204,51210,51211,51212,51213,51214,51400,51401,51402,51403,51404,51405,51500,51501,51502,51503,51504,51505'); break;
		case "hoodie"        : setDefaults('51300', '51300,51301, 51302, 51303, 51304, 51305, 51306, 51307, 51308, 51309'); break;
		case "wall clings"   : setDefaults('95000', '95002, 95009, 95000, 95008, 95001'); break;
		case "calendars"     : setDefaults('70300', '70300, 70305'); break;
		case "folded cards"  : setDefaults('70205', '70205,70210,70250,70255'); break;
		case "photo card"    : setDefaults('30551', '30541,30542,30551,30552,30581,30582,30603,30605'); break;
		case "flat cards"    : setDefaults('75000', '75000,75001,75002,75003,75004,75005,75006,75021,75022,75023,75024,75025,75026,75027,75007,75008,75009,75010,75011,75012,75013,75028,75029,75030,75031,75032,75033,75034,75014,75015,75016,75017,75018,75019,75020,75035,75036,75037,75038,75039,75040,75041,75042,75043,75044,75045,75046,75047,75048,75063,75064,75065,75066,75067,75068,75069,75049,75050,75051,75052,75053,75054,75055,75070,75071,75072,75073,75074,75075,75076,75056,75057,75058,75059,75060,75061,75062,75077,75078,75079,75080,75081,75082,75083,75084,75085,75086,75087,75088,75089,75090,75105,75106,75107,75108,75109,75110,75111,75091,75092,75093,75094,75095,75096,75097,75112,75113,75114,75115,75116,75117,75118,75098,75099,75100,75101,75102,75103,75104,75119,75120,75121,75122,75123,75124,75125,75126,75127,75128,75129,75130,75131,75132,75147,75148,75149,75150,75151,75152,75153,75133,75134,75135,75136,75137,75138,75139,75154,75155,75156,75157,75158,75159,75160,75140,75141,75142,75143,75144,75145,75146,75161,75162,75163,75164,75165,75166,75167'); break;
		case "canvas"        : setDefaults('90110', '90100,90011,90012,90013,90026,90110,90020,90030,90050,90070,90080,90110,90120,90140,90160,90170'); break;
		case "wrapped canvas": setDefaults('90110', '90100,90011,90012,90013,90026,90110,90020,90030,90050,90070,90080,90110,90120,90140,90160,90170'); break;
		case "rolled canvas" : setDefaults('90020', '90100,90011,90012,90013,90026,90110,90020,90030,90050,90070,90080,90110,90120,90140,90160,90170'); break;
		case "framed canvas" : setDefaults('82100', '82100,82101,82102,82103,82104,82105,82106,82107,82108,82109,82110,82111,82112,82113,82114,82115,82117,82118,82119,82120,82121,82122,82124,82126,82127,82128,82129,82130,82131,82133,82134,82135,82136,82137,82138,82139,82140,82141,82142,82143,82144'); break;
		case "framed poster" : setDefaults('82200', '82200,82201,82202,82203,82204,82205,82206,82207,82209,82210,82211,82213,82214,82215,82216,82217,82218,82219,82220,82221,82222,82223,82224,82225,82226,82227,82228,82229,82230,82231,82233,82234,82235,82236,82237,82238,82239,82240,82241,82242,82243,82244'); break;
		case "rolled poster" : setDefaults('90400', '90400,90401,90402,90403,90404,90405,90406,90407,90408,90409,90410,90411,90412,90413,90414'); break;
		case "playing cards" : setDefaults('70002'); break;
		case "puzzle"        : setDefaults('10127'); break;
		case "ornament"      : setDefaults('10138', '10137, 10138'); break;
		case "photo panel"   : setDefaults('10571', '10570,10571,10572,10574'); break;
		case "coasters"      : setDefaults('10113'); break;
		case "keepsake box"  : setDefaults('10240'); break;
		case "water bottle"  : setDefaults('10301'); break;
		case "tile"          : setDefaults('10121', '10120,10121'); break;
		case "button"        : setDefaults('85100', '85100,85110'); break;
		case "mousepad"      : setDefaults('10101'); break;
		case "mug"           : setDefaults('10102T', '10102T,10190,10112T,10115'); break;
		case "desk organizer": setDefaults('10241'); break;
		case "key tag"       : setDefaults('10118'); break;
		case "luggage tag"   : setDefaults('10117'); break;
		case "address label" : setDefaults('73015'); break;
		case "stickers"      : setDefaults('73000', '73000,73005'); break;
		case "frame"         : setDefaults('601100', '601100,601200,601300,601400,601500,601600,602000,602100,602200,602300,602400,602500,601001,601002,601101,601102,601201,601202,601401,601402,601501,601502,601601,601602,602001,602002,602101,602102,602201,602202,602301,602302,602401,602402,602501,602502'); break;
	}

	finalUrl += "?productName=" + productName;
	if (typeof(activeSku)!="undefined") {
		finalUrl += "&activeSku=" + activeSku;
	}
	if (typeof(skuList)!="undefined") {
		finalUrl += "&skus=" + skuList;
	}
	
	document.location = finalUrl;
	return false;
}


//// No right click on images
function disableRightClick()
{
    var message="Professional portraits are protected. Please use the 'Share' function to share with friends and family. Thank you.";

    var clickIE = function()
    {
        if ( (document.all) && !/ezptest.com/i.test( window.location.hostname ) )
        {
            alert(message);
            return false;
        }
    }

    var clickNS = function(e)
    {
        if(document.layers||(document.getElementById&&!document.all))
        {
            if ( (e.which==2||e.which==3) && !/ezptest.com/i.test( window.location.hostname ) )
            {
                alert(message);
                document.oncontextmenu = new Function("return false");
                return false;
            }
         }
    }


    if (document.layers)
    {
        document.captureEvents(Event.MOUSEDOWN);
        document.onmousedown=clickNS;
    }
    else
    {
        document.onmouseup = clickNS;
        document.oncontextmenu = clickIE;
    }

}

// NO
//disableRightClick();



function bindEnterToMethod(element,methodCall)
{
    Event.observe(element, 'keypress', function(evt){

        if(evt.keyCode == Event.KEY_RETURN)
        {
            methodCall();
            //Event.stop(evt);
               // return alert( element );
        }
    });


}



function launchConfigurator(productName, projectKey, category, item, cartSku) {
	var configPath = '/initialize.aspx';
	var finalUrl = configPath + '?' + 'sku=' + productName;
	// + '&userToken=' + getToken();
	//finalUrl += '&userName=ryan.connelly@gmail.com';
	//finalUrl += '&ezpUserToken=' + getToken();
    if (projectKey) finalUrl += '&projectKey=' + projectKey
    if (category) finalUrl += '&category=' + category;
	if (item) finalUrl += '&item=' + item;
	if (cartSku) finalUrl += '&cartSku=' + cartSku;

	document.location = finalUrl;

	return false;
}

function go()
{
	var destination = document.jumpMenu.selectProducts.options[document.jumpMenu.selectProducts.selectedIndex].value;
	if ( destination.include('launch') ) {
		eval(destination);
	}
	else {
		window.location = destination;
	}
}




function show(id)
{
	d = document.getElementById(id);
	d.style.display = "block";
}

function hide(id)
{
	d = document.getElementById(id);
	d.style.display = "none";
}

function showinline(id)
{
	d = document.getElementById(id);
	d.style.display = "inline";
}




/* String */
String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ""); };


/* highlight thumbnail photos */

var hoverThumbs = function( )
{
	if( $$( "div.thumbBox div.thumbBoxInner img.thumb" ) )
	{
		$$( "div.thumbBox div.thumbBoxInner" ).each( function( item )
		{
			item.onmouseover = function(  )
			{
				item.className+="_Over";
			}
			item.onmouseout = function( )
			{
				item.className = item.className.replace( "_Over", "" );
			}
		} );
	}
}



/******************************************
  checkout
******************************************/

// this class manages the changes that happen when a different shipping country is selected
var CountryManager = Class.create({

	initialize: function(bUpdateCart) {

		if ($('shippingCountry')) {
			// go ahead and call it
			this.showCountryFields('shipping',bUpdateCart);

			// call again when it changes
			Event.observe('shippingCountry', 'change', function(){this.showCountryFields('shipping',bUpdateCart)}.bind(this));
		}

		if ($('billingCountry')) {
			// go ahead and call it
			this.showCountryFields('billing',false);

			// call again when it changes
			Event.observe('billingCountry', 'change', function(){this.showCountryFields('billing',false)}.bind(this));
		}
	},

	showCountryFields: function(addressType, bUpdateCart) {
		if ( $F(addressType+'Country') == 'USA' || $(addressType+'Country').value == '') {
			$$('.'+addressType+'Domestic').invoke('show');
			$$('.'+addressType+'International').invoke('hide');
			$$('.'+addressType+'Canada').invoke('hide');
		}
		else if ( $F(addressType+'Country') == 'CAN' ) {
			$$('.'+addressType+'Domestic').invoke('hide');
			$$('.'+addressType+'International').invoke('hide');
			$$('.'+addressType+'Canada').invoke('show');
		}
		else {
			$$('.'+addressType+'Domestic').invoke('hide');
			$$('.'+addressType+'International').invoke('show');
			$$('.'+addressType+'Canada').invoke('hide');
		}

		if (bUpdateCart) {
			this.updateCountry();
		}
	},

	updateCountry: function() {
		var FirstName = $('shippingFirstName').value;
		var LastName = $('shippingLastName').value;
		var Address1 = $('shippingAddress01').value;
		var Address2 = $('shippingAddress02').value;
		var City = $('shippingCity').value;
		var PhoneNumber = '';
		var MiddleInitial = '';
		var Country = $('shippingCountry').value;
		var StateProvince = '';
		var PostalCode = '';

		if ( Country == _usa ) {
			StateProvince = $('shippingState').value;
			PostalCode = $('shippingZip').value;
		}
		else if ( Country == _canada ) {
			StateProvince = $('shippingProvinceCA').value;
			PostalCode = $('shippingPostalCA').value;
		}
		else {
			StateProvince = $('shippingProvince').value;
			PostalCode = $('shippingPostal').value;
		}

		EZP.Api.Presentation.Web.Ajax.eCommerce.setCartShippingAddress(getToken(), FirstName, MiddleInitial, LastName, PhoneNumber, Address1, Address2, City, StateProvince, PostalCode, Country, this.updateShippingMethods, this.onFail, this);
	},

	updateShippingMethods: function(Cart) {
		
		Cart = Cart.d;	// unwrap the response
		removeElementChildren($('shippingDescriptionP'));

		var newSelect = document.createElement("select");
		newSelect.id = "shippingType"
		newSelect.name = "shippingType"
		Event.observe(newSelect, 'change', OnShippingChange, false);


		//Cart.shippingMethods.each(function(shippingMethod) {
		Cart.shippingMethods.sortBy(function(shippingMethod) { return parseInt(shippingMethod.amount) }).each(function(shippingMethod) {
			var option = document.createElement("option");
			option.value = shippingMethod.id;
			option.text  = shippingMethod.id + " - " + shippingMethod.amount;
			option.innerText  = shippingMethod.id + " - " + shippingMethod.amount;
			if (shippingMethod.id == Cart.shippingMethod.id) {
				option.selected = true;
			}
			
			newSelect.appendChild(option);
		});

		$('shippingDescriptionP').appendChild(newSelect);

		OnShippingChange();
	},

	onFail: function(response) {
		alert(response.get_message());
	}

});



function CopyAddress(to, from) {
	CopyField(to, from, 'FirstName');
	CopyField(to, from, 'LastName');
	CopyField(to, from, 'Phone');
	CopyField(to, from, 'Email');
	$(to+'Address01').value  =  $(from+'Address01').value;
	$(to+'Address02').value  =  $(from+'Address02').value;
	$(to+'City').value       =  $(from+'City').value;
	$(to+'Country').value    =  $(from+'Country').value;
	$(to+'State').value      =  $(from+'State').value;
	$(to+'Province').value   =  $(from+'Province').value;
	$(to+'ProvinceCA').value =  $(from+'ProvinceCA').value;
	$(to+'Zip').value        =  $(from+'Zip').value;
	$(to+'Postal').value     =  $(from+'Postal').value;
	$(to+'PostalCA').value   =  $(from+'PostalCA').value;
}

function CopyField(to, from, field) {
	if ($(from+field)) {
		$(to+field).value  =  $(from+field).value;
	}
}

function EnableDisableAddress(addressType, bDisable) {
	// if addressType rows are defined, just hide/show them
	if ( $$('.' + addressType + 'Row') ) {
		if (bDisable) {
			$$('.' + addressType + 'Row').invoke('hide');
		}
		else {
			$$('.' + addressType + 'Row').invoke('show');

			// have to unhide anything we just made visible that shouldn't be
			countryManager.showCountryFields(addressType, false);
		}
	}
	else {  // otherwise, disable/enable them
		$(addressType+'AddressSelect').disabled = bDisable;
		$(addressType+'FirstName').disabled     = bDisable;
		$(addressType+'LastName').disabled      = bDisable;
		$(addressType+'Phone').disabled         = bDisable;
		$(addressType+'Email').disabled         = bDisable;
		$(addressType+'Address01').disabled     = bDisable;
		$(addressType+'Address02').disabled     = bDisable;
		$(addressType+'City').disabled          = bDisable;
		$(addressType+'Country').disabled       = bDisable;
		$(addressType+'State').disabled         = bDisable;
		$(addressType+'Province').disabled      = bDisable;
		$(addressType+'ProvinceCA').disabled    = bDisable;
		$(addressType+'Zip').disabled           = bDisable;
		$(addressType+'Postal').disabled        = bDisable;
		$(addressType+'PostalCA').disabled      = bDisable;
	}
}

// requires countryManager
function DoSameAs(to, from, bDisable) {
	if(bDisable) {
		CopyAddress(to, from);
	}
	EnableDisableAddress(to, bDisable);
}




function OnShippingChange()
{
	cartManager.changeShippingMethod($('shippingType').value);
}

function UpdateShippingIfNecessary()
{
	//DisableShippingAddress($('sameAsBillingCheckboxId').checked);
}

function placeOrder()
{
	// must now be done just before ordering bc which fields are required changes
	setupValidation();

	if(validateForm())
	{
		$('btnPlaceOrder').className += " wait";
		$('btnPlaceOrder').disabled = true;

		$('formActionField').value = 'placeOrder';
		$('checkoutForm').submit();
	}
}

var returnToCart = function()
{
	$('formActionField').value = 'returnToCart';
	$('checkoutForm').submit();
}

function onAddressSelectedFromAddressBook(addressType) {
	if ($(addressType+'AddressSelect').value) {
		var address = AddressBookHash.get($(addressType+'AddressSelect').value)
		if (address) {
			$(addressType+'FirstName').value = address.firstName;
			$(addressType+'LastName').value = address.lastName;
			$(addressType+'Address01').value = address.address1;
			$(addressType+'Address02').value = address.address2;
			$(addressType+'City').value = address.city;
			$(addressType+'Country').value = address.country;
			if ( $(addressType+'Country').value == _usa ) {
				$(addressType+'State').value = address.state;
				$(addressType+'Zip').value = address.zip;
			}
			else if ( $(addressType+'Country').value == _canada ) {
				$(addressType+'ProvinceCA').value = address.state;
				$(addressType+'PostalCA').value = address.zip;
			}
			else {
				$(addressType+'Province').value = address.state;
				$(addressType+'Postal').value = address.zip;
			}
		}

		var bUpdateCart = (addressType == 'shipping') ? true : false;
		countryManager.showCountryFields(addressType, bUpdateCart);
	}
}

function setupValidation()
{
	cartManager.checkoutValidator.SetSummaryField('summaryMsgId');
	cartManager.checkoutValidator.AddFormField($('shippingFirstName'), $('shippingFirstName_err'), "A shipping first name is required.", cartManager.checkoutValidator.IsValidField);
	cartManager.checkoutValidator.AddFormField($('shippingLastName'), $('shippingLastName_err'), "A shipping last name is required.", cartManager.checkoutValidator.IsValidField);
	cartManager.checkoutValidator.AddFormField($('shippingAddress01'), $('shippingAddress01_err'), "A shipping address is required.", cartManager.checkoutValidator.IsValidField);
	cartManager.checkoutValidator.AddFormField($('shippingCity'), $('shippingCity_err'), "A shipping city is required.", cartManager.checkoutValidator.IsValidField);
	cartManager.checkoutValidator.AddFormField($('shippingCountry'), $('shippingCountry_err'), "A shipping country is required.", cartManager.checkoutValidator.IsValidSelect);
	if ( $('shippingCountry').value == _usa ) {
		cartManager.checkoutValidator.AddFormField($('shippingState'), $('shippingState_err'), "A shipping state is required.", cartManager.checkoutValidator.IsValidSelect);
		cartManager.checkoutValidator.AddFormField($('shippingZip'), $('shippingZip_err'), "A valid shipping zip code is required.", cartManager.checkoutValidator.IsValidZip);
	}
	else if ( $('shippingCountry').value == _canada ) {
		cartManager.checkoutValidator.AddFormField($('shippingProvinceCA'), $('shippingProvinceCA_err'), "A shipping province is required.", cartManager.checkoutValidator.IsValidSelect);
		cartManager.checkoutValidator.AddFormField($('shippingPostalCA'), $('shippingPostalCA_err'), "A valid shipping postal code is required.", cartManager.checkoutValidator.IsValidField);
	}
	else {
		cartManager.checkoutValidator.AddFormField($('shippingPostal'), $('shippingPostal_err'), "A valid shipping postal code is required.", cartManager.checkoutValidator.IsValidField);
	}

	if ($('divAccountSetup') != null)
	{
	    if ($('divAccountSetup').style.display.toLowerCase() != 'none')
	    {
			if ($('loginEmail') != null)
			{
				cartManager.checkoutValidator.AddFormField($('loginEmail'), $('loginEmail_err'), "A valid email is required.", cartManager.checkoutValidator.IsValidEmail);
			}
	        cartManager.checkoutValidator.AddFormField($('loginPassword1'), $('loginPassword1_err'), "A valid password is required.", cartManager.checkoutValidator.IsValidPassword);
	        cartManager.checkoutValidator.AddFormField($('loginPassword2'), $('loginPassword2_err'), "You must confirm your password.", cartManager.checkoutValidator.IsValidField);
	    }
	}

	cartManager.checkoutValidator.AddFormField($('billingFirstName'), $('billingFirstName_err'), "A billing first name is required.", cartManager.checkoutValidator.IsValidField);
	cartManager.checkoutValidator.AddFormField($('billingLastName'), $('billingLastName_err'), "A billing last name is required.", cartManager.checkoutValidator.IsValidField);
	cartManager.checkoutValidator.AddFormField($('billingAddress01'), $('billingAddress01_err'), "A billing address is required.", cartManager.checkoutValidator.IsValidField);
	cartManager.checkoutValidator.AddFormField($('billingCity'), $('billingCity_err'), "A billing city is required.", cartManager.checkoutValidator.IsValidField);
	cartManager.checkoutValidator.AddFormField($('billingCountry'), $('billingCountry_err'), "A shipping country is required.", cartManager.checkoutValidator.IsValidSelect);
	if ( $('billingCountry').value == _usa ) {
		cartManager.checkoutValidator.AddFormField($('billingState'), $('billingState_err'), "A billing state is required.", cartManager.checkoutValidator.IsValidSelect);
		cartManager.checkoutValidator.AddFormField($('billingZip'), $('billingZip_err'), "A valid billing zip code is required.", cartManager.checkoutValidator.IsValidZip);
	}
	else if ( $('billingCountry').value == _canada ) {
		cartManager.checkoutValidator.AddFormField($('billingProvinceCA'), $('billingProvinceCA_err'), "A billing province is required.", cartManager.checkoutValidator.IsValidSelect);
		cartManager.checkoutValidator.AddFormField($('billingPostalCA'), $('billingPostalCA_err'), "A valid billing postal code is required.", cartManager.checkoutValidator.IsValidField);
	}
	else {
		cartManager.checkoutValidator.AddFormField($('billingPostal'), $('billingPostal_err'), "A valid billing postal code is required.", cartManager.checkoutValidator.IsValidField);
	}

	cartManager.checkoutValidator.AddCCFields($('ccType'), $('creditCardNumber'), $('expirationMonth'), $('expirationYear'),
		$('nameOnCard'), $('securityCode'), $('ccErrorMessageField'), "A valid credit card is required.", cartManager.checkoutValidator.IsValidCreditCard);
}



/**************************************************************
	for left nav content pages - help, about, pro
***************************************************************/
function hideall() {
	//document.getElementsByClassName('content').each(function(item){
	$$('.content').each(function(item){
		item.hide();
	});
}

function toggleDiv(divid) {
	hideall();
	$(divid).show();
}

function toggleBundleDiv(source,target) {
    $j("#" + source).hide();
    $j("#" + target).show();
    var referrer = String(document.location).split("/services/");
    referrer = referrer[1];
    if (referrer == "what-we-do.aspx#ezpBuilderDemo") {
        $j.cookie("builderPage", "what-we-do.aspx#ezpBuilder");
    } else {
        $j.cookie("builderPage", document.location);
    }
    $j.cookie("referrer", document.referrer);
    //alert($j.cookie("builderPage"));
}

function goToAnchor(defaultContentDiv) {

	var anchor = window.location.hash;

	var anchorTag = anchor.sub('#','');
	var contentDiv = anchorTag.sub(/-.+$/,'');
	var nav = contentDiv + '-Nav';

	// open the nav section
	if ($(nav)) {
		g_leftNav.activate($(nav));
	}

	// show the "page"
	contentDiv = $(contentDiv) ? contentDiv : defaultContentDiv;
	toggleDiv(contentDiv);

	// scroll to the anchor point
	//window.location.href = anchor;
}


/*
Common functions
*************************************/

var hideOverlay = function(popupId) {
	if( $(popupId) ) {
		new Effect.Fade(popupId);
	}
	if( $('overlayInner') ) {
		new Effect.Fade( 'overlayInner' , { from: 0.8, to: 0 } );
	}
}

var showOverlay = function() {
	if( $('overlayInner') ) {
		$('overlayInner').show();
	}
}

var togglePopover = function( div ) {
	if ($(div).style.display == 'none') {
		//showOverlay();
		$(div).show();
	}
	else {
		//hideOverlay(div);
		$(div).hide();
	}
	return false;
}




/************************************
*************************************

         Widget Functions

************************************
************************************/

function pickerChanged(sourceId, albumId)
{
	setCookie("currentAlbum", albumId);
}