/*
 * Copyright (C) 2008 Ignition Commerce.
 * All Rights Reserved.  No use, copying or distribution of this
 * work may be made except in accordance with a valid license
 * agreement from IgnitionCommerce.  This notice must be
 * included on all copies, modifications and derivatives of this
 * work.
 *
 * @Author Mike Sewell
 * @Version 1.0
 * @Since 1.0
 */
if (top.location != location) {
    top.location.href = document.location.href ;
} 
 
function addEvent(obj, evType, fn) {
  if (obj == null) return;
  if (obj.addEventListener) {
    obj.addEventListener(evType, fn, false);
   	return true;
  } else if (obj.attachEvent) {
   	var r = obj.attachEvent("on"+evType, fn);
   	return r;
  } else {
   	return false;
  }
}

function removeEvent(obj, evType, fn) {
  if (obj == null) return;
  if (obj.removeEventListener) {
    obj.removeEventListener(evType, fn, false);
    return true;
  } else if (obj.detachEvent) {
    var r = obj.detachEvent("on"+evType, fn);
    return r;
  } else {
    return false;
  }
}

function cancelEvent(e) {
  if (e && e.preventDefault) {
    e.preventDefault();
  } else {
	try {
	  e.returnValue = false; 
	}catch(err){/*Ignore because returnValue was not available*/}
  }
  return false;   
}

function validateCCNumber(ccNum) {
  var isValid = false;
  var ccCheckRegExp = new RegExp("[^\\d -]");
  isValid = !ccCheckRegExp.test(ccNum);	
  if (isValid)
  {
	isValid = false;
    var cardNumbersOnly = ccNum.replace(/\s+/g,"");
    cardNumbersOnly = cardNumbersOnly.replace(/-+/g, "");
    var cardNumberLength = cardNumbersOnly.length;	
    if (cardNumberLength > 13) {
    	isValid = true;
    }
  }
  return isValid;
}

function validateMultipleEmails(emailListStr) {
  var emails = emailListStr.split(";");
  
  if(emails.length > 1) {
	for(i = 0; i < emails.length; i++) {
	  if(validateEMail(jq.trim(emails[i])) == false) {
	    return false;
	  }
	}
	return true;
  }
  else {
	return (validateEMail(jq.trim(emailListStr)));
  }
}

function validateEMail(emailStr) {
  if (emailStr.length == 0) return false;
  var pattern = new RegExp("^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$");
  var isValid = pattern.test(emailStr);	
  if(jq('#yourEmail').val() != '') {
	  validationErrorStrings['yourEmail'] = 'Enter valid email address';
  }
  if(jq('#emailOfRecipient').val() != '') {
	  validationErrorStrings['emailOfRecipient'] = 'Enter valid email address for your friend';
  }
  return isValid;
}

var passwordErrorType = "matching";

var passwordErrorMessage = {
  'matching' : 'Password must match',
  'minLength' : 'Password must be at least 6 characters',
  'maxLength' : 'Password must stay under 10 characters',
  'alphanumeric' : 'Password must contain alphanumeric characters',
  'blank' : 'Password can not be blank'		
};

function validatePassword (password) {
  var myRegxp = /[^0-9]/; 
 
  if(password == '') {
	passwordErrorType = 'blank';
	return false;  
  }
  else if (jq("#verifyPassword").get(0) != null && password != jq("#verifyPassword").get(0).value) {
	passwordErrorType = 'matching';
	return false;	
  }
  else if (password.length < 6) {
	passwordErrorType = 'minLength';
	return false;  
  }
  else if (password.length > 10) {
	passwordErrorType = 'maxLength';
	return false;  
  }
  else if (myRegxp.test(password)==false) { 
	passwordErrorType = 'alphanumeric';
	return false;
  } 
  else {
	return true;  
  }
}

function validateRegisterBirthDate() {
  var day = jq('#dobDay').val();
  var month = jq('#dobMonth').val();
  if(((day == '-1') && (month == '-1'))) {
	return true;
  } else if(((day == '-1') || (month == '-1'))) {
  	return false;
  } else {
    return true;
  }
}

function validateDate(dateStr) {
  if (dateStr.length == 0) return false;
  var pattern = new RegExp("(0[1-9]|[1-9]|1[012])[- /.](0[1-9]|[1-9]|[12][0-9]|3[01])[- /.](19|20)\\d\\d");
  return pattern.test(dateStr);	
}

function validatePhone(phoneStr) {
  if (phoneStr.length == 0) return false;
  var newPhoneStr = phoneStr.replace(/[^0-9]/g, '');
  if(newPhoneStr != 10) {
	  validationErrorStrings['phone'] = 'A Valid Phone Number is Required';
  }
  return newPhoneStr.length == 10;
}

function validatePostal(postalStr) {
  if (postalStr.length == 0) return false;
  var tempCountry = docElem = document.getElementById("country").value;
    if (tempCountry == "CA") {
    	var objRegExp  = /(^[a-zA-Z]\d[a-zA-Z][-\s]?\d[a-zA-Z]\d$)/;  // space is optional so it takes H2K 2H9 or H2K2H9
    	   
    } else {
    	var objRegExp  = /(^\d{5}$)|(^\d{5}-\d{4}$)/;
  	}
  return objRegExp.test(postalStr);
}

function createMouseEvent(event, object)
{
    var delta = 0;
    if (!event) event = window.event;
    if (event.wheelDelta) 
    {
        delta = event.wheelDelta/120; 
        if (window.opera) delta = -delta;
    } 
    else if (event.detail) 
    { 
        delta = -event.detail/3; 
    }
    if(delta < 0 && delta > -1)
        delta = -1;
    else if(delta > 0 && delta < 1)
        delta = 1;
    else
        delta = Math.round(delta);
    x = event.screenX;
    y = event.screenY;
    
    if(object.createMouseEvent)
    {
	    object.createMouseEvent(x,y,delta);
        return cancelEvent(event);
    }
    return true;
}

function insertFlexComponent(id, location, width, height, attributes, flashvars, params)
{
	// Requires that there be an element with id='id' previously in the html document to replace.
	if(!attributes) 
	{
		attributes = {}
	}
	attributes.id = id;
	attributes.name = id;
	
	if(!params) 
	{
		params = {}
	}
	params.wmode = "transparent";
	
	try 
    {
        if(swfobject.hasFlashPlayerVersion('9'))
        {
            swfobject.embedSWF( location + ".swf", id, width, height, "9", "/images/playerProductInstall.swf", flashvars, params, attributes);
        }
   	}
   	catch(e) {}
}


var gup = function( name ) {
  var results = (new RegExp("[\\?&]"+name+"=([^&#]*)")).exec(window.location.href);
  if ( results == null ) {return ""}
  else {return results[1]}
};

function sortSelectObj(selectObj, values) {
	var sizeOrder = values;
	if(values) sizeOrder = values.split(',');
	if (selectObj == null) return;
	var sizeOrder = values.split(',');
	var selectedValue = '';
	if (selectObj.selectedIndex > -1) {
  	    selectedValue = selectObj.options[selectObj.selectedIndex].text;
  	}
	var newArray = new Array();
	var newArrayIdx = 0;
	if (selectObj != null && selectObj.options != undefined) {
		for (var i=0;i<sizeOrder.length;i++) {
		  	for (var y=0;y<selectObj.options.length;y++) {
		  	    if (sizeOrder[i] == selectObj.options[y].text) {
		  	    	newArray[newArrayIdx++] = sizeOrder[i];
		  	    	break;
		  	    }
		  	}
	  	}
		// Now see if we missed one.
		newArrayIdx = 0;
		if (newArray.length < selectObj.options.length-1) {
			var newArray2 = new Array();
			for (var i=0;i<selectObj.options.length;i++) {
				var found = false;
				for (var y=0;y<newArray.length;y++) {
					if (selectObj.options[i].value == newArray[y]) {
						found = true;
						break;
					}
				}
				if (found == false && selectObj.options[i].value != '-1') {
					// Add to the end of newArray
					newArray2[newArrayIdx++] = selectObj.options[i].value;
				}
			}
			for (var y=0;y<newArrayIdx;y++) {
				newArray[newArray.length] = newArray2[y];
			}
		}
	}
	emptySelectObj(selectObj);
	for (var i=0;i<newArray.length;i++) {
		selectObj.options[selectObj.options.length] = new Option(newArray[i], newArray[i]);
	}
	if (selectedValue != '') {
	    for (var i=0;i<selectObj.options.length;i++) {
	        if (selectedValue == selectObj.options[i].text) {
   	            selectObj.selectedIndex = i;
   	        }
  	    }
  	}	
}

function checkKeyPress(evt, elementid) {
    if(evt.keyCode == 13) { 
      document.getElementById(elementid).click(); 
      return false;
    }
  }

function sortSelectObjByValue(selectObj, values) {
	var sizeOrder = values;
	if(values) sizeOrder = values.split(',');
	if (selectObj == null) return;
	var sizeOrder = values.split(',');
	var selectedValue = '';
	if (selectObj.selectedIndex > -1) {
  	    selectedValue = selectObj.options[selectObj.selectedIndex].value;
  	}
	var newArray = new Array();
	var newArrayIdx = 0;
	if (selectObj != null && selectObj.options != null) {
		for (var i=0;i<sizeOrder.length;i++) {
		  	for (var y=0;y<selectObj.options.length;y++) {
		  	    if (sizeOrder[i] == selectObj.options[y].value) {
		  	    	newArray[newArrayIdx++] = selectObj.options[y].text;
		  	    	break;
		  	    }
		  	}
	  	}
		// Now see if we missed one.
		newArrayIdx = 0;
		if (newArray.length < selectObj.options.length-1) {
			var newArray2 = new Array();
			for (var i=0;i<selectObj.options.length;i++) {
				var found = false;
				for (var y=0;y<newArray.length;y++) {
					if (selectObj.options[i].value == newArray[y]) {
						found = true;
						break;
					}
				}
				if (found == false && selectObj.options[i].value != '-1') {
					// Add to the end of newArray
					newArray2[newArrayIdx++] = selectObj.options[i].text;
				}
			}
			for (var y=0;y<newArrayIdx;y++) {
				newArray[newArray.length] = newArray2[y];
			}
		}
	    emptySelectObj(selectObj);
	    for (var i=0;i<newArray.length;i++) {
		    selectObj.options[selectObj.options.length] = new Option(newArray[i], newArray[i]);
	    }
	    if (selectedValue != '') {
	        for (var i=0;i<selectObj.options.length;i++) {
	            if (selectedValue == selectObj.options[i].value) {
   	                selectObj.selectedIndex = i;
   	            }
   	        }
  	    }
  	}	
}

function emptySelectObj(selectObj) {
  if (selectObj == null || selectObj.options == undefined) return;

  for (var i=0; i<selectObj.options.length;i++) {
	if (selectObj.options[i].value != '-1') {
	  selectObj.remove(i);
	  i--;
	}
  }
}


function getOptions(array, value, name)
{
    var options = "";
    var object;
    for(var i = 0; i < array.length; i++)
    {
        object = array[i];
        options = options + "<option value='" + object[value] + "'>" + object[name] + "</option>\r\n"; 
    }
    return options;
}


/***********************************************/
/******** Validation Methods *******************/
/***********************************************/

var validationErrorStrings = 
{
	'nickName'  		: 'Nick Name is required',
    'firstName' 		: 'First Name is required',
    'lastName'  		: 'Last Name is required',
    'address1'  		: 'Address is required',
    'city'      		: 'City is required',
    'state'     		: 'State is required',
    'country'   		: 'Country is required',
    'postal'    		: 'Zip Code is required',
    'phone'     		: 'Phone Number is required',
    'email'     		: 'Email is required',
    'password'			: 'Password must match',
    'verifyPassword'	: 'Verify Password is required',
    'cardNumber'		: 'Credit Card Number is invalid',
    'cardType'			: 'Credit Card Type is required',
    'yourName'      	: 'Your Name is required',
    'yourEmail' 		: 'Email is required',
    'emailSubject'		: 'Subject is required',
    'emailOfRecipient' 	: 'Friend Email is required',
    'message'			: 'Message is required'
};
    
var validationTextInput =
{
	'nickName'  	 	: true,
    'firstName' 		: true,
    'lastName'  		: true,
    'address1'  		: true,
    'city'      		: true,
    'email'				: true,
    'password'			: true,
    'verifyPassword'	: true,
    'cardNumber'		: true,
    'cardType'			: true,
    'yourName' 			: true,
    'yourEmail'			: true,
    'emailSubject'  	: true,
    'emailOfRecipient'	: true,
    'message' 			: true
};  
   
var validationSelectField =
{
    'state'     		: true,
    'country'   		: true,
    'cardType'			: true
}; 
   
var validationFunctions =
{
    'postal'    		: validatePostal,
    'phone'     		: validatePhone,
    'email'     		: validateEMail,
    'emailOfRecipient'  : validateEMail,
    'password'  		: validatePassword,
    'newEmail'			: validateEMail,
    'newPassword' 		: validatePassword,
    'cardNumber'		: validateCCNumber,
    'yourEmail' 		: validateEMail
};

function getErrorString(element_id, errorString) 
{
    var docElem = null;
    
    if(element_id != null)
        docElem = document.getElementById(element_id);
        
    if(docElem != null)
    {
        var isError = false;
        if(validationTextInput[element_id] == true && jq.trim(docElem.value) == '')
            isError = true;
        else if(validationSelectField[element_id] == true && docElem.value == -1)
            isError = true;
        else if(validationFunctions[element_id] != null)
            isError = !eval(validationFunctions[element_id](docElem.value));
            
        if(isError == true)
        {
            if(errorString == null)
                errorString = validationErrorStrings[element_id];
        }
        else
            errorString = null;             
    }
    
    return errorString;
}

var doValidate = true;
function startValidateForm(e) 
{
	if(doValidate)
	{
		return validateAllItems(e);
	}
	else
	{
		doValidate = true; // reset global variable
		return true;
	}
}
  
function validateAllItems(event) 
{
    var success = true;    
    for(var element_id in validationErrorStrings)
    {
    	validateForm(event, element_id);
    }
    
    for(var element_id in validationErrorStrings)
    {
    	success = success && validateForm(event, element_id);
    }
    return success;
}
  
/**
 * Validate a form element.
 * 
 * The event is passed through so that it may be canceled on the event of a validation error.  Consider the prevention of form submission.
 * 
 * Source can either be an actual DOM element or the DOM element id.
 */
function validateForm(event, source)
{
    var docElem = null;
    var docId = null;
    var errorString = null;
    
    if(source == null)
    	validateAllItems();
    // Test to see if the source is a string id.
    if(typeof source == 'string')
    {
        docId = source;
        docElem = document.getElementById(source);
    }
    else
    {
       docElem = source;
       docId = docElem.id;
    }
    
    // In the case where the id and element are both null then an invalid id was used.  Ignore and continue.
    if(docElem == null || docId == null)
    {
        setBubbleVisible(false);
        return true;
    }
    // Test for an error.
    errorString = getErrorString(docId, null);
    
    try 
    {
    	docElem.parentNode.parentNode.cleanWhitespace();
    }
    catch(e) {}
    
    // If an error reflect the error on the label and with a bubble message.
    if(errorString && errorString.length > 0)
    {
        var className = docElem.parentNode.parentNode.childNodes[0].className + '';
    	docElem.parentNode.parentNode.childNodes[0].className = className.replace(/missing\s?/g, '') + ' missing';
        var retVal = cancelEvent(event);
        setupBubble(docId, errorString, false);
        setBubbleVisible(true);   
        return retVal;
    }
    // Otherwise if validation succeeded remove any previous indication of failure.
    else 
    {
    	return clearError(docId);
    }
}

function clearAllErrors()
{
	for(var element_id in validationErrorStrings)
    {
        clearError(element_id);
    }
}

function clearError(element_id)
{
	var docElem = jq('#'+element_id).get(0);
	if(!docElem) return;
	var className = docElem.parentNode.parentNode.childNodes[0].className + '';
    docElem.parentNode.parentNode.childNodes[0].className = className.replace(/missing\s?/g, '');
    setBubbleVisible(false);
    return true;
}

  // For ATG Live Chat
  function atg_chat_agents_available() 
   {
    jq('#footerHelpCheckoutPhone').hide();
    return true;
    }

  function atg_chat_agents_not_available() 
   {   
    jq('#footerHelpCheckoutChat').hide();
    //jq('#myAccountAtgChat').hide();
	//jq('#myAccountAtgChat').html('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;');
    return true;
   }

	function atg_chat_left_menu(vendId) 
   {
    var chatInTxt = '<a href="" onClick="window.open(\'https://admin.instantservice.com/links/' + vendId +
				'\', \'chat_client\', \'width=600,height=324,scrollbars=0\'); return false;">' +
				'<img src="/images/ms_left_nav_chatbanner.jpg" border=0></a>';
    jq('#leftMenuAtgChat').html(chatInTxt);
    return true;
    }
    
function validateCCNumberADS(ccNum) {
  var isValid = false;
  var ccCheckRegExp = new RegExp("[^\\d -]");
  isValid = !ccCheckRegExp.test(ccNum);	
  if (isValid)
  {
	isValid = false;
    var cardNumbersOnly = ccNum.replace(/\s+/g,"");
    cardNumbersOnly = cardNumbersOnly.replace(/-+/g, "");
    var cardNumberLength = cardNumbersOnly.length;	
    if (cardNumberLength > 7) {
    	isValid = true;
    }
  }
  return isValid;
}