/* <![CDATA[ */

function isDigit(e) {
	var evtObj = window.event ? window.event : e;
	var ok = false;

	if (evtObj.keyCode == 8) {ok = true;
	} else if (evtObj.keyCode == 9) {ok = true;
	}  	else if (evtObj.keyCode == 46) {ok = true;
	} else if (evtObj.keyCode == 37) {ok = true;
	} else if (evtObj.keyCode == 39) {ok = true;
	} else if (evtObj.keyCode == 35) {ok = true;
	} else if (evtObj.keyCode == 36) {ok = true; 
	} else if (evtObj.keyCode == 144) {ok = true;
	} else if (evtObj.keyCode >= 48 && evtObj.keyCode <= 57) { ok = true; 
	} else if (evtObj.keyCode >= 96 && evtObj.keyCode <= 105) { ok = true;
	} else {
		//alert(evtObj.keyCode);
	}

	return ok;
}

function doIntegerFloorValidation(params) {
	var ok = true;
	
	var targetValue = 0;
	if (null != params.control.value) {
		targetValue = stripToNumber(params.control.value);
	}
	
	if (!params.control.value || (targetValue < params.validator.vData)) {
		showError(params, true);
		setFieldError(params.control, true, params.validator.errorFunc); 
		params.submitButtons[0].validationOK = false;

		ok = false;		
	} else {
		showError(params, false);
		setFieldError(params.control, false, params.validator.errorFunc);
	}
	
	return ok;
}



function fixupMoneyField(field) {
	var num = field.value;
	
	num = stripToNumber(num);

	// ljs - moved to admin.js (commaize())
	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));
	
	field.value = num;
	
	return;
}

function validateFromEvent( evt ){
	executeValidation(this);
}

function setupControlValidator(control, validationData) {
    var evtType = "blur";
  
  	if (validationData.vFunc != doHasValueValidation) {
    	addEventHandler( control, 'on' + evtType, validateFromEvent.bindAsEventListener(validationData));
   	}
}

function addValidation(controls, validators, submitButtons, postValidationFctn) {
	for (var i = 0; i < controls.length; i++) {
	    for (var j = 0; j < validators.length; j++) {
		    var validator = validators[j];
		
			var validationData = { validator:validator, control: controls[i], submitButtons:submitButtons, postValidationFctn: postValidationFctn};
			    
		    setupControlValidator(controls[i], validationData);
		    
		    var addValidationToSubmitButton = function(btn) {if(!btn.vPackages) {btn.vPackages = new Array();}btn.vPackages[btn.vPackages.length] = validationData;}; 	
	                
			if(submitButtons.length) {     
				for(var btnNdx = 0; btnNdx < submitButtons.length ; btnNdx++ ) {
					addValidationToSubmitButton(submitButtons[btnNdx]);
				}
			} else {
				addValidationToSubmitButton(submitButtons);
			}
		}
	}
} 


/**************************************************/
function initGeneralValidation() {
	addValidation([$('address1')], [{vFunc:doHasValueValidation, vData:null, errorText:"Enter house name/number", errorLabel:$('address1Error')}], [$('getQuoteButton')]);
	addValidation([$('email')], [{vFunc:doEmailAddressValidation, vData:null, errorText:"Please enter a valid email address", errorLabel:$('emailError')}], [$('getQuoteButton')]);
	addValidation([$('workPhone')], [{vFunc:doUKPhoneNumberValidation, vData:null, errorText:"Enter your work or mobile phone number.", errorLabel:$('workPhoneError')}], [$('getQuoteButton')]);
	addValidation([$('firstName')], [{vFunc:doHasValueValidation, vData:{minLength:2}, errorText:"Enter your first name", errorLabel:$('firstNameError')}], [$('getQuoteButton')]);
	addValidation([$('lastName')], [{vFunc:doHasValueValidation, vData:{minLength:2}, errorText:"Enter your last name", errorLabel:$('lastNameError')}], [$('getQuoteButton')]);
}

function executeValidation(curPackage) {
	var prevalidationOK = true;			
	var preValidation = curPackage.validator.preValidation 
	
	if (preValidation) {
		//var originalControl = curPackage.control;	// save original control for later restoration..
		
		for (var j = 0; j < preValidation.length; j++) {
			var curPreValidation = preValidation[j];
			
			var prevalidator = { vFunc:curPreValidation.vFunc, vData: curPreValidation.vData, errorLabel: curPreValidation.errorLabel, errorText: curPreValidation.errorText, control: preValidation[j].control, submitButtons:curPackage.submitButtons };
			var preValidationData = { validator: prevalidator, control: preValidation[j].control, submitButtons:curPackage.submitButtons };
			
			//var preValidationPackage = curPackage;
			//curPackage.control = preValidation[j].control;
			
			if (!preValidation[j].vFunc(preValidationData)) {
				prevalidationOK = false;
			}
		} 
		//curPackage.control = originalControl;
	}
	
	if (prevalidationOK) {
		try {
			if (curPackage.validator.vFunc(curPackage)) {
				if (curPackage.postValidationFctn) {
					curPackage.postValidationFctn();
				}
			}
		} catch (ex) {
							
		}
	}
}


function processValidatorChain(controls) {
	
	for (var i = 0; i < controls.length; i++) {
		var ctrl = controls[i];
		var vPackages = ctrl.vPackages;
		var lastValidatorNdx = (vPackages.length - 1);
		
		if (ctrl.nextValidatorNdx > lastValidatorNdx) {		// reached end of chain
			
			if (ctrl.validationOK) {
				tka_hide('errorHeader');
				
				ctrl.successFctn();
			} else {
				tka_show('errorHeader');

				new ajax('/adm/fis', {postBody: serializeFctn(ctrl.form), onComplete: incompleteFormPostBackComplete});
				
				if (null != ctrl.failureFctn) {
					ctrl.failureFctn();
				}
				return;
			}
			
		} else {	// more validators in chain to process..
			var curPackage = vPackages[ctrl.nextValidatorNdx++];
			
			executeValidation(curPackage);

			processValidatorChain(curPackage.submitButtons); 	// hand off to next validator in chain
		}
	}
}

var serializeFctn = null;

var lcSearchActive = false;

function beginLCSearch() {
	if (lcSearchActive) {
		return;
	}
	lcSearchActive = true;
	
	var body = serializeFctn();
	
	var req = "op=lcSearch&=" + body;
	
	new Ajax.Request("/adm/fis", {
	 onSuccess : function(transport) {
		lcSearchActive = false;
		var json = transport.responseText.evalJSON(true);
		
		if (json.resultCode == "0") {
			// handle the form error..
			tka_hide('lcDetails');
			$('lcName').innerHTML = "<span id='lcName'></span>";
		} else if (json.resultCode == "1") {
			// form is fine; no LC found
			tka_hide('lcDetails');
			$('lcName').innerHTML = "<span id='lcName'></span>";
		} else if (json.resultCode == "2") {
			// form is fine; found a Lc
			tka_show('lcDetails');
			$('lcName').innerHTML = "<span id='lcName'>" + json.lcDetails + "</span>";;
		}
	 },
	 onFailure : function(resp) {
	 	lcSearchActive = false;
	 },
	 requestHeaders: {Accept: 'application/json'},   
	 parameters : req
	});


	
}

function startFormValidation(ctrl, form, successFctn, failureFctn) {
	ctrl.nextValidatorNdx = 0;
	ctrl.theForm = form;
	ctrl.validationOK = true;
	ctrl.successFctn = successFctn;
	ctrl.errorString = "";
	ctrl.failureFctn = failureFctn;
	
	processValidatorChain([ctrl]);
	
	return 0;
}


/****************************************** VALIDATORS ***********************/
function setNormalFieldError(f, i) { try { if (i) { tka_addClassName($(f), 'errorField');} else { tka_removeClassName($(f),'errorField'); } } catch (ex) {} }
function setMnyFieldError(f, i) { try { if (i) { tka_addClassName($(f), 'pound_error'); } else { tka_removeClassName($(f), 'pound_error');  } } catch (ex) {} }
function setUSMnyFieldError(f, i) { try { if (i) { tka_addClassName($(f), 'dollar_error'); } else { tka_removeClassName($(f), 'dollar_error');  } } catch (ex) {} }

function showError(params, isError) {
	if (isError) {
		params.validator.errorLabel.innerHTML = "<span id='" + params.validator.errorLabel.id + "' class='errorTextRow' style='display:block'>" + params.validator.errorText + "</span>";
		//params.validator.errorLabel.innerHTML = params.validator.errorText;
		//params.validator.errorLabel.style.visibilty='visible'; 
	} else {
		params.validator.errorLabel.innerHTML = "<span id='" + params.validator.errorLabel.id + "' style='display:none'></span>";
		//params.validator.errorLabel.innerHTML = "&nbsp;";
		//params.validator.errorLabel.style.visibilty='hidden';	
	}
}

function showAlternateErrorText(params, isError, alternateErrorText) {
	if (isError) {
		params.validator.errorLabel.innerHTML = "<span id='" + params.validator.errorLabel.id + "' class='errorTextRow' style='display:block'>" + alternateErrorText + "</span>";
	} else {
		params.validator.errorLabel.innerHTML = "<span id='" + params.validator.errorLabel.id + "' class='errorTextRow' style='display:none'></span>";	
	}
}

function setFieldError(field, errorState, customErrorFunc) {
	if (!customErrorFunc) {
		setNormalFieldError(field, errorState);	
	} else {
		customErrorFunc(field, errorState);
	}
}

var postCodeValidationActive = false;

function doPostCodeValidation(params) {
	if (postCodeValidationActive) { 
		return;
	}
	postCodeValidationActive = true; 
	
	var ok = true;
	
	var req = "op=validateAddress&bnn=" + $('address1').value + "&postCode=" + $('postCode').value + "&market=" + $('marketID').value;
	
	new Ajax.Request("/adm/fis", {
	 onSuccess : function(transport) {
		postCodeValidationActive = false;

		var json = transport.responseText.evalJSON(true);
		
		if (json.value == 1) {
			showError(params, false);
			setFieldError(params.control, false);
		} else {
			showError(params, true);
			setFieldError(params.control, true);
			params.submitButtons[0].validationOK = false;
		}
	 },
	 onFailure : function(resp) {
	 	postCodeValidationActive = false;
	 },
	 requestHeaders: {Accept: 'application/json'},   
	 parameters : req
	});
	
	return ok;
}

// ljs - not so much a true validator as a reformatter (no failure case)
function doUKMoneyFieldFixupValidation(params) { 
	var ok = true;
	
	var val = params.control.value;
	fixupMoneyField(params.control);
	
	return ok;
}


function doEmailAddressValidation(params) {
	var ok = true;
	
	var val = params.control.value;
	
	val = val.replace(" ", "");
	params.control.value = val;
	
	var re = new RegExp("^([-\\w\\.!#\\$%\+`'_]+@[-A-Za-z0-9]+(\\.[-A-Za-z0-9\]{2,})+)$");
	  
	if (!re.test(val)) {
		showError(params, true);
		setFieldError(params.control, true); 
		params.submitButtons[0].validationOK = false;

		ok = false;		
	} else {
		showError(params, false);
		setFieldError(params.control, false);
	}
	
	return ok;
}

function doNonzeroSelectIndexValidation(params) {
	var ok = true;
	
	if (params.control.selectedIndex == 0) {
		showError(params, true);
		setFieldError(params.control, true); 
		params.submitButtons[0].validationOK = false;
		ok = false;
	} else {
		showError(params, false);
		setFieldError(params.control, false);
	}
	
	return ok;
}

function doHasValueValidation(params) {
	var ok = true;
	
	var minLength = 1;
	
	var data = params.validator.vData;
	if (data != null && null != data.minLength) {
		minLength = data.minLength;
	} 
	
	if (params.control.value.length < minLength) {
		showError(params, true);
		setFieldError(params.control, true, params.validator.errorFunc); 
		params.submitButtons[0].validationOK = false;
		ok = false;
	} else {
		showError(params, false);
		setFieldError(params.control, false, params.validator.errorFunc);
	}
	return ok;
}

function doOneOfTwoRadioButtonsHasValueIfOtherRadioButtonIsCheckedValidation(params) {
	var ok = true;
	
	var data = params.validator.vData;
	
	if (null != data.controllerRadioButton) {
		if (data.controllerRadioButton.checked) {
			return doOneOfTwoRadioButtonsHasValueValidation(params);
		}
	}

	return ok;
}

function doFieldHasValueIfRadioButtonIsCheckedValidation(params) {
	var ok = true;
	
	var data = params.validator.vData;
	
	if (null != data.controllerRadioButton) {
		if (data.controllerRadioButton.checked) {
			return doHasValueValidation(params);
		}
	}

	return ok;
}

function stripToNumber(str) {
	var num = 0;
	
	try {
		str = str.replace("£", "");
		num = str.toString().replace(/\$|\,/g,'');
	} catch (ex) { }
	
	return num;
}

function doOneOfTwoRadioButtonsHasValueValidation(params) {
	var ok = true;
	
	var data = params.validator.vData;
	var b1 = data.buttonOne;
	var b2 = data.buttonTwo;

	if (!b1.checked && !b2.checked) {
		showError(params, true);
		setFieldError(params.control, true); 
		params.submitButtons[0].validationOK = false;
		ok = false;
	} else {
		showError(params, false);
		setFieldError(params.control, false);
	}
	
	return ok;
}

function doUKPhoneNumberValidation(params) {
	var ok = true;
	
	var phoneNumber = params.control.value.split(" ").join("");
	var errorText = "";
	
	// no country codes
	if (phoneNumber.match(/^\+.+$/)) {
		errorText = "Enter phone number without country code.";
		ok = false;
	}

	if( phoneNumber.replace(/[^0-9]*([0-9]*)/g, "$1").length < phoneNumber.length )	{
		ok = false;
	} else {
		phoneNumber = phoneNumber.replace(/[^0-9]*([0-9]*)/g, "$1");
	}

	// first digit must be zero
	if ( phoneNumber.match(/^0[0-9]{9,10}$/) == null ) {
		errorText = "UK phone numbers start with 0";
		ok = false;
	}

	// proper length is 10 or 11 digits
	if( phoneNumber.match(/^[0-9]{10,11}$/) == null ) {
		errorText = "UK phone numbers are 10 or 11 digits.";
		ok = false;
	}

	// must not be a 06 or 070 phone number
	if ( phoneNumber.match(/^(06|070)[0-9]+$/) ) {
		errorText = "06 and 070 phone numbers are not accepted.";
		ok = false;
	}

	// must start /w one of the approved prefixes
	if (phoneNumber.match(/^(01|02|03|05|07|08)[0-9]+$/) == null ) {
		errorText = "Enter a valid UK phone number";
		ok = false;
	}

	// prohibit excessive digit repitiion (7 or more)
	if (phoneNumber.match(/^\d*(\d)\1{7}\d*$/) ) {
		errorText = "Enter a valid UK phone number";
		ok = false;
	}

	if (!ok) {
		showAlternateErrorText(params, true, errorText.length > 0 ? errorText : params.validator.errorText);
		setFieldError(params.control, true);
		params.submitButtons[0].validationOK = false;
	} else {
		showError(params, false);
		setFieldError(params.control, false);
	}
	
	return ok;
}


/******************
POSTBACK support for incomplete forms.. 
*******************/
function serializeFormFields(leadForm) {
	var f = leadForm;

	var pimaId = -1;
	try {
		pimaId = f.productInMarketAliasID.options[f.productInMarketAliasID.selectedIndex].value; 	
	} catch (ex) {
		try {
			pimaId = f.productInMarketAliasID.value;
		} catch (ex2) {
		}
	}
				
	var fields = "firstName=" + f.firstName.value + "&lastName=" + f.lastName.value + 
		"&productInMarketAliasID=" + pimaId + 
		"&workPhone=" + f.workPhone.value + "&homePhone=" + f.homePhone.value + 
		"&email=" + f.email.value + "&address1=" + f.address1.value + "&postCode=" + f.postCode.value +
		"&ec=" + f.ec.value + "&dpima=" + f.dpima.value;			// ljs 2/8/09 - TOADD: marketID 
	return fields;
}

function incompleteFormPostBackComplete() {return;}


var postcodeOutcodes = new Array();
postcodeOutcodes[0]="AB";
postcodeOutcodes[1]="DG";
postcodeOutcodes[2]="DD";
postcodeOutcodes[3]="FK";
postcodeOutcodes[4]="EH";
postcodeOutcodes[5]="KY";
postcodeOutcodes[6]="KA";
postcodeOutcodes[7]="IV";
postcodeOutcodes[8]="KW";
postcodeOutcodes[9]="PA";
postcodeOutcodes[10]="PH";
postcodeOutcodes[11]="ML";
postcodeOutcodes[12]="HS";
postcodeOutcodes[13]="ZE";
postcodeOutcodes[14]="CF";
postcodeOutcodes[15]="LD";
postcodeOutcodes[16]="LL";
postcodeOutcodes[17]="NP";
postcodeOutcodes[18]="SA";
postcodeOutcodes[19]="SY";
postcodeOutcodes[20]="BD";
postcodeOutcodes[21]="DH";
postcodeOutcodes[22]="DL";
postcodeOutcodes[23]="DN";
postcodeOutcodes[24]="HD";
postcodeOutcodes[25]="HG";
postcodeOutcodes[26]="HU";
postcodeOutcodes[27]="HX";
postcodeOutcodes[28]="LN";
postcodeOutcodes[29]="LS";
postcodeOutcodes[30]="NE";
postcodeOutcodes[31]="SR";
postcodeOutcodes[32]="TS";
postcodeOutcodes[33]="WF";
postcodeOutcodes[34]="YO";
postcodeOutcodes[35]="BB";
postcodeOutcodes[36]="BL";
postcodeOutcodes[37]="CA";
postcodeOutcodes[38]="CH";
postcodeOutcodes[39]="CW";
postcodeOutcodes[40]="FY";
postcodeOutcodes[41]="LA";
postcodeOutcodes[42]="M";
postcodeOutcodes[43]="OL";
postcodeOutcodes[44]="PR";
postcodeOutcodes[45]="SK";
postcodeOutcodes[46]="TF";
postcodeOutcodes[47]="WA";
postcodeOutcodes[48]="WN";
postcodeOutcodes[49]="B";
postcodeOutcodes[50]="CV";
postcodeOutcodes[51]="DE";
postcodeOutcodes[52]="DY";
postcodeOutcodes[53]="LE";
postcodeOutcodes[54]="NG";
postcodeOutcodes[55]="NN";
postcodeOutcodes[56]="ST";
postcodeOutcodes[57]="WS";
postcodeOutcodes[58]="WV";
postcodeOutcodes[59]="AL";
postcodeOutcodes[60]="CB";
postcodeOutcodes[61]="CM";
postcodeOutcodes[62]="CO";
postcodeOutcodes[63]="EN";
postcodeOutcodes[64]="IG";
postcodeOutcodes[65]="IP";
postcodeOutcodes[66]="LU";
postcodeOutcodes[67]="MK";
postcodeOutcodes[68]="NR";
postcodeOutcodes[69]="PE";
postcodeOutcodes[70]="RM";
postcodeOutcodes[71]="SG";
postcodeOutcodes[72]="SS";
postcodeOutcodes[73]="WD";
postcodeOutcodes[74]="BA";
postcodeOutcodes[75]="BH";
postcodeOutcodes[76]="BS";
postcodeOutcodes[77]="DT";
postcodeOutcodes[78]="EX";
postcodeOutcodes[79]="GL";
postcodeOutcodes[80]="HR";
postcodeOutcodes[81]="PL";
postcodeOutcodes[82]="TA";
postcodeOutcodes[83]="TQ";
postcodeOutcodes[84]="TR";
postcodeOutcodes[85]="WR";
postcodeOutcodes[86]="GU";
postcodeOutcodes[87]="HA";
postcodeOutcodes[88]="HP";
postcodeOutcodes[89]="OX";
postcodeOutcodes[90]="PO";
postcodeOutcodes[91]="RG";
postcodeOutcodes[92]="SL";
postcodeOutcodes[93]="SN";
postcodeOutcodes[94]="SO";
postcodeOutcodes[95]="SP";
postcodeOutcodes[96]="UB";
postcodeOutcodes[97]="BN";
postcodeOutcodes[98]="BR";
postcodeOutcodes[99]="CR";
postcodeOutcodes[100]="CT";
postcodeOutcodes[101]="DA";
postcodeOutcodes[102]="KT";
postcodeOutcodes[103]="ME";
postcodeOutcodes[104]="RH";
postcodeOutcodes[105]="SM";
postcodeOutcodes[106]="TN";
postcodeOutcodes[107]="TW";
postcodeOutcodes[108]="E";
postcodeOutcodes[109]="EC";
postcodeOutcodes[110]="N";
postcodeOutcodes[111]="NW";
postcodeOutcodes[112]="SE";
postcodeOutcodes[113]="SW";
postcodeOutcodes[114]="W";
postcodeOutcodes[115]="WC";
postcodeOutcodes[116]="G";
postcodeOutcodes[117]="TD";
postcodeOutcodes[118]="GY";
postcodeOutcodes[119]="JE";
postcodeOutcodes[120]="BT";
postcodeOutcodes[121]="IM";
postcodeOutcodes[122]="S";
postcodeOutcodes[123]="L";


function doPostCodeFormatVerification( params)
{
	var ok = false;
	
	var postcode = params.control.value.split(" ").join("");
	
	/* Permitted letters depend upon their position in the postcode.*/
	var alpha1 = "[abcdefghijklmnoprstuwyz]";                       /* Character 1*/
	var alpha2 = "[abcdefghklmnopqrstuvwxy]";                       /* Character 2*/
	var alpha3 = "[abcdefghjkstuw]";                                /*Character 3*/
	var alpha4 = "[abehmnprvwxy]";                                  /*Character 4*/
	var alpha5 = "[abdefghjlnpqrstuwxyz]";                          /*Character 5*/

	/* Array holds the regular expressions for the valid postcodes*/
	var pcexp = new Array ();

	/* Expression for postcodes: AN NAA, ANN NAA, AAN NAA, and AANN NAA*/
	pcexp.push (new RegExp ("^(" + alpha1 + "{1}" + alpha2 + "?[0-9]{1,2})(\\s*)([0-9]{1}" + alpha5 + "{2})$","i"));
	
	/* Expression for postcodes: ANA NAA*/
	pcexp.push (new RegExp ("^(" + alpha1 + "{1}[0-9]{1}" + alpha3 + "{1})(\\s*)([0-9]{1}" + alpha5 + "{2})$","i"));

	/* Expression for postcodes: AANA  NAA*/
	pcexp.push (new RegExp ("^(" + alpha1 + "{1}" + alpha2 + "?[0-9]{1}" + alpha4 +"{1})(\\s*)([0-9]{1}" + alpha5 + "{2})$","i"));

	/* Assume we're not going to find a valid postcode*/
	var valid = false;
	
	/* Check the string against the types of post codes*/
	for ( var i=0; i<pcexp.length; i++ )
	{
		if (pcexp[i].test(postcode))
		{
		  /* The post code is valid - split the post code into component parts*/
		  pcexp[i].exec(postcode);
		  
		  /* Copy it back into the original string, converting it to uppercase and
		   inserting a space between the inward and outward codes*/
		  postcode = RegExp.$1.toUpperCase() + " " + RegExp.$3.toUpperCase();
		  
		  /* Load new postcode back into the form element*/
		  valid = true;
		  
		  /* Remember that we have found that the code is valid and break from loop*/
		  break;
		}
	}
  
	if( valid )
	{
		var postcodeOutcode = '';
		
		/* Pull just the Outcode from the Postcode*/
		if( isFinite( postcode.charAt(1) ) )
		{
			postcodeOutcode = postcode.charAt(0);
		}
		else
		{
			postcodeOutcode = postcode.substring(0, 2);
		}

		/* Check the Outcode is in the list*/
		for( index in postcodeOutcodes )
		{
			if( postcodeOutcode == postcodeOutcodes[index] )
			{
				/* Appears valid*/
				ok = true;
			}
		}
	}

	if (!ok) {
		showError(params, true);
		setFieldError(params.control, true); 
		params.submitButtons[0].validationOK = false;
		ok = false;
	} else {
		showError(params, false);
		setFieldError(params.control, false);
	}
	
	return ok;
}


/* ]]> */		
