/*
	[sooper] validate.js v2.2 (c)2001-2003
	Ryan Vettese - Interface Developer (CE) - Organic
	rvettese@organic.com - 416-874-7007
	---------------------------------------------------------
*/

var err = 0;
var sendError = true;
var errorMessage = '';
var errorAlertMessage = '';
var emptyFieldMessage = '';
var currentForm = '';
var runReturnValue = 0;
var runFieldValue = 1;

function submitForm(arg_which) {
	if(ogncUVal(arg_which)) eval(arg_which[0][1]).submit();
}

function submitFormOnce(arg_which) {
	if (sendError && ogncUVal(arg_which)) {
		sendError = false;
		eval(arg_which[0][1]).submit();
	}
}

function ogncUVal(VDArray) {
	resetErrs();
	return validateForm(VDArray, false);
}

function resetErrs() {
	//reset err counter and err text
	err=0;
	errorMessage = '';
	errorAlertMessage = '';
	emptyFieldMessage = '';
	return true;
}

function validateForm(VDArray) {
	currentForm = VDArray[0][1];
	
	//loop through all the form elements
	for (x=1; x<VDArray.length; x++) {
		//set niceName and defaultValue from the first and second params of the 'check' array.
		niceName = VDArray[x][1];
		defaultValue = VDArray[x][2];

		//loop through the rest of the 'check' array.
		for (yc=3; yc<VDArray[x].length; yc++) {
			evaluateFunction(currentForm,VDArray[x],yc);
		}
	}
	
	//if there's an error then alert the error text.
	if(err>0) {
		if (sendError==true) {
			errorAlertMessage=langString('error0') + "\n\n";
			if (emptyFieldMessage.length > 0) {
				errorAlertMessage=errorAlertMessage + langString('error1') + '\n\n   ' + emptyFieldMessage.substring(0,emptyFieldMessage.length - 2) + "\n\n";
				if (errorMessage.length > 0) {
					errorAlertMessage=errorAlertMessage + langString('error2') + '\n\n';
				}
			}
			if (errorMessage.length > 0) {
				errorAlertMessage=errorAlertMessage+ errorMessage + "\n\n";
			}
			alert(errorAlertMessage);
		}
		sendError=true;
		return false;
	}
	//otherwise, submit the form and have a nice day.
	else { sendError=true; return true; }
}

function evaluateFunction(currentForm, arrayItem, itemNo) {
	runIf = false;
	runWhat = new Array();
	runAgainst = new Array();
	runNo = 0;
	functionName = arrayItem[itemNo][0];
	returnValue = null;
	//call the param as a function with three arguments.
	//arg 1 - the form field name in string format.
	//arg 2 - the nice name for the error alert.
	//arg 3 - default field value

	if(functionName=='runIf') {
		runIf = true;
		runWhat[runNo] = arrayItem[itemNo];
		runAgainst[runNo] = runFieldValue;
		runNo++;
	} else {
		functionCall = functionName+'(\''+currentForm+'.elements.'+arrayItem[0]+'\',\''+arrayItem[1]+'\',\''+arrayItem[2]+'\'';
		if(arrayItem[itemNo].length>1) {
			for(ze=1; ze<arrayItem[itemNo].length; ze++) {
				if(arrayItem[itemNo][ze][0] && arrayItem[itemNo][ze][0]=='runIf') {
					runIf = true;
					runWhat[runNo] = arrayItem[itemNo][ze];
					runAgainst[runNo] = runReturnValue;
					runNo++;
				}
				functionCall = functionCall + ',\''+arrayItem[itemNo][ze]+'\'';
			}
		}
		functionCall = functionCall+')';
		returnValue = eval(functionCall);
	}

	if(runIf) {
		for(co=0; co<runNo; co++) {
			//alert('----'+getFieldValue(currentForm+'.elements.'+arrayItem[0])+'----'+returnValue+'----'+runWhat[co][1]+'----'+runAgainst[co]+'----'+runFieldValue);
			//alert(getFieldValue(currentForm+'.elements.'+arrayItem[0])+' '+runWhat[co][1]);
			var getFieldVal = getFieldValue(currentForm+'.elements.'+arrayItem[0]);
			var tFunc = getFieldVal+''+runWhat[co][1];
			if(isNaN(getFieldVal) || getFieldVal.length==0) {
				tFunc = '\''+getFieldVal+'\''+runWhat[co][1];
			}
			if((runAgainst[co]==runReturnValue && returnValue==runWhat[co][1]) || (runAgainst[co]==runFieldValue && getFieldValue(currentForm+'.elements.'+arrayItem[0])==runWhat[co][1]) || (runAgainst[co]==runFieldValue && eval(tFunc))) {
				evaluateFunction.call(this,currentForm,eval(runWhat[co][2]),3);
			}
		}
	}
}

function getFieldValue(arg_whichField) {
	fieldObj = eval(arg_whichField);
	//select boxes - a multiple box will only return the first value now
	if (fieldObj.type=='select-one' || fieldObj.type=='select-multiple') {
		if (fieldObj.selectedIndex == -1) {
		  return false;
		} else {
		  return (fieldObj.options[fieldObj.selectedIndex].value);
		}
	} else if(fieldObj.type=='checkbox') {
		if(fieldObj.checked) return true;
		else return false;
	//a group of radio buttons
	} else if(fieldObj[0] && fieldObj[0].type=='radio') {
		for(var i=0;i<fieldObj.length;i++) {
			if(fieldObj[i].checked) {
				return fieldObj[i].value;
			}
		}
		//nothing checked
		return false;
	}
	//a single radio button - would this ever happen?
	else if(fieldObj.type=='radio') {
		if(fieldObj.checked) return true;
		else return false;
	}
	//all other types of inputs - text/password/hidden
	else { return(fieldObj.value); }
}

function checkEmpty(arg_whichField,arg_niceName,arg_default) {
	fieldValue = getFieldValue(arg_whichField);
	if (isEmpty(fieldValue,arg_default)) {
		err++;
		if (emptyFieldMessage.substring(emptyFieldMessage.lastIndexOf('\n')).length > 60) {
			emptyFieldMessage = emptyFieldMessage + '\n   ';
		}
		emptyFieldMessage = emptyFieldMessage + arg_niceName+', ';
		return true;
	} else { return false; }
}

function isEmpty(arg_value,arg_default) {
	if (arg_value.length==0 || arg_value=='' || (arg_value==false) || (arg_value==arg_default && arg_default!='')) {
		return true;
	} else { return false; }
}

function checkNumeric(arg_whichField,arg_niceName,arg_default) {
	fieldValue = getFieldValue(arg_whichField);
	if (isNaN(fieldValue) && (fieldValue!=arg_default || arg_default=='')) {
		flagError(langString('checkNumeric', arg_niceName));
		return true;
	} else { return false; }
}

function checkAlpha(arg_whichField,arg_niceName) {
	fieldValue = getFieldValue(arg_whichField);
	regEx = /(\d+)|(^\s+)/;
	if ((fieldValue.length>0) && (regEx.test(fieldValue))) {
		flagError(langString('checkAlpha', arg_niceName));
		return true;
	} else { return false; }
}

function checkAlphaNumeric(arg_whichField,arg_niceName) {
	fieldValue = getFieldValue(arg_whichField);
	regEx = /\W+/;
	if ((fieldValue.length>0) && (regEx.test(fieldValue))) {
		flagError(langString('checkAlphaNumeric', arg_niceName));
		return true;
	} else { return false; }
}

function checkLength(arg_whichField,arg_niceName,arg_default,arg_length) {
	fieldValue = getFieldValue(arg_whichField);
	if (fieldValue.length!=eval(arg_length) && (fieldValue!=arg_default || arg_default=='')) {
		flagError(langString('checkLength', arg_niceName, arg_length));
		return true;
	} else { return false; }
}

function checkMinLength(arg_whichField,arg_niceName,arg_default,arg_length) {
	fieldValue = getFieldValue(arg_whichField);
	if (fieldValue.length < eval(arg_length) && (fieldValue!=arg_default || arg_default=='')) {
		flagError(langString('checkMinLength', arg_niceName, arg_length));
		return true;
	} else { return false; }
}

function checkMaxLength(arg_whichField,arg_niceName,arg_default,arg_length) {
	fieldValue = getFieldValue(arg_whichField);
	if (fieldValue.length > eval(arg_length) && (fieldValue!=arg_default || arg_default=='')) {
		flagError(langString('checkMaxLength', arg_niceName, arg_length, fieldValue.length));
		return true;
	} else { return false; }
}

function checkValidDate(arg_whichField,arg_niceName,arg_default,arg_otherNiceName,singleField,arg_month,arg_day,arg_year) {
	dErr=0;

	if (singleField=='true') {
		fieldValue = getFieldValue(arg_whichField);
		ms = arg_month.split(',');
		ds = arg_day.split(',');
		ys = arg_year.split(',');
		varMonth=fieldValue.substring(ms[0],ms[1]);
		varDay=fieldValue.substring(ds[0],ds[1]);
		varYear=fieldValue.substring(ys[0],ys[1]);
	} else {
		varMonth=getFieldValue(currentForm+'.elements.'+arg_month);
		varDay=getFieldValue(currentForm+'.elements.'+arg_day);
		varYear=getFieldValue(currentForm+'.elements.'+arg_year);
	}
	if ((varMonth>=0 && varDay>=0 && varYear>=0) ||
		(varMonth.length>0 && varDay.length>0 && varYear.length>0) &&
		(fieldValue!=arg_default || arg_default=='')) {

		if (isNaN(varYear) || isNaN(varMonth) || isNaN(varDay)) dErr=1;
		if (varYear<1900 || varYear>2051) dErr=1;
		if (varMonth<1 || varMonth>12) dErr=1;
		if (varDay<1 || varDay>31) dErr=1;

		if (varMonth==4 || varMonth==6 || varMonth==9 || varMonth==11) {
			if (varDay==31) dErr=1;
		}
		
		if (varMonth==2) {
			var g=parseInt(varYear/4);
			if (isNaN(g)) dErr=1;
			if (varDay>29) dErr=1;
			if (varDay==29 && ((varYear/4)!=parseInt(varYear/4))) dErr=1;
		}
		if (dErr==1) flagError(langString('checkValidDate', arg_otherNiceName));
	}
}

function checkAge(arg_whichField,arg_niceName,arg_default,arg_otherNiceName,validAge,arg_month,arg_day,arg_year) {
	varMonth=getFieldValue(currentForm+'.elements.'+arg_month);
	varDay=getFieldValue(currentForm+'.elements.'+arg_day);
	varYear=getFieldValue(currentForm+'.elements.'+arg_year);

	if (varMonth>=0 && varDay>=0 && varYear>=0) {
		if (!isAge(0,0,parseFloat(validAge),arg_month,arg_day,arg_year)) {
			flagError(langString('checkAge', arg_otherNiceName, validAge));
		}
	}
}

function isAge(ageMonth,ageDay,ageYear,arg_month,arg_day,arg_year) {
	varMonth=getFieldValue(currentForm+'.elements.'+arg_month);
	varDay=getFieldValue(currentForm+'.elements.'+arg_day);
	varYear=getFieldValue(currentForm+'.elements.'+arg_year);

	var testDate = new Date(parseFloat(varYear) + ageYear, parseFloat(varMonth) - 1 + ageMonth, parseFloat(varDay) + ageDay);
	var theYear = new Date().getYear();
	if (theYear < 1900) {
		theYear = theYear + 1900;
	}
	var todayDate = new Date(theYear, new Date().getMonth(), new Date().getDate());

	if (testDate <= todayDate) {
		return true;
	} else { return false; }
}

function checkCanadianPostal(arg_whichField,arg_niceName,arg_default) {
	fieldValue = getFieldValue(arg_whichField);
	if(isNotCanadianPostal(fieldValue)) {
		flagError(langString('zipPostal', arg_niceName));
		return true;
	} else { return false; }
}

function isNotCanadianPostal(arg_value) {
	regEx = /[a-zA-Z][0-9][a-zA-Z][0-9][a-zA-Z][0-9]/;
	if((arg_value.length>0) && (!(regEx.test(arg_value)))) {
		return true;
	} else { return false; }
}

function checkAmericanZip(arg_whichField,arg_niceName,arg_default) {
	fieldValue = getFieldValue(arg_whichField);
	if ((fieldValue.length>0) && (((fieldValue.length!=5) && (fieldValue.length!=9)) || isNaN(fieldValue))) {
		flagError(langString('zipPostal', arg_niceName));
		return true;
	} else { return false; }
}

function checkLow(arg_whichField,arg_niceName,arg_default,arg_low) {
	fieldValue = getFieldValue(arg_whichField);
	if ((fieldValue.length>0) && (isNaN(fieldValue) || (parseFloat(fieldValue) < parseFloat(eval(arg_low))))) {
		flagError(langString('checkLow', arg_niceName, arg_low));
		return true;
	} else { return false; }
}

function checkHigh(arg_whichField,arg_niceName,arg_default,arg_high) {
	fieldValue = getFieldValue(arg_whichField);
	if ((fieldValue.length>0) && (isNaN(fieldValue) || (parseFloat(fieldValue) > parseFloat(eval(arg_high))))) {
		flagError(langString('checkHigh', arg_niceName, arg_high));
		return true;
	} else { return false; }
}

function checkEmail(arg_whichField,arg_niceName,arg_default) {
	fieldValue = getFieldValue(arg_whichField);
	var regEx1 = /^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/;
	if((fieldValue.length>0) && (!regEx1.test(fieldValue))) {
		flagError(langString('checkEmail', arg_niceName));
		return true;
	} else { return false; }
}

function checkLongLatCoord(arg_whichField,arg_niceName,arg_default) {
	fieldValue = getFieldValue(arg_whichField);
	var regEx1 = /^[0-9]{1,3}[nsew][0-9]{1,2}\.[0-9]{1,3}(\]?)$/;
	//var regEx1 = /^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/;
	if((fieldValue.length>0) && (!regEx1.test(fieldValue))) {
		flagError(langString('checkLongLat', arg_niceName));
		return true;
	} else { return false; }
}

function checkPassword(arg_whichField,arg_niceName,arg_default,arg_checkAgainst,arg_minLength) {
	password1=getFieldValue(arg_whichField);
	password2=getFieldValue(arg_checkAgainst);
	if(password1!=password2) {
		flagError(langString('checkPasswordMatch'));
		return true;
	} else {
		if(password1.length<arg_minLength || password2.length<arg_minLength) {
			flagError(langString('checkPasswordLength',arg_minLength));
			return true;
		} else { return false; }
	}
}

function flagError(arg_errorText) {
	errorMessage=errorMessage+'   '+arg_errorText+'\n';
	err++;
}

function throwError(errorText) {
	flagError(errorText);
}

function clearDefault(arg_whichField, arg_defaultValue) {
	if (arg_whichField.value == arg_defaultValue) { arg_whichField.value=""; }
}

function langString(stringNumber) {
	if (stringNumber == 'error0') {
		return 'Sorry, the form could not be submitted yet. Please correct the following fields and re-enter.';
	}
	if (stringNumber == 'error1') {
		return 'The following fields cannot be left empty:';
	}
	if (stringNumber == 'error2') {
		return 'Additionally:';
	}
	if (stringNumber == 'checkNumeric') {
		return 'The '+langString.arguments[1]+' field must be a number';
	}
	if (stringNumber == 'checkAlpha') {
		return 'The '+langString.arguments[1]+' field must contain only alpha characters (a-Z)';
	}
	if (stringNumber == 'checkAlphaNumeric') {
		return 'The '+langString.arguments[1]+' field must contain only alpha or number characters';
	}
	if (stringNumber == 'checkLength') {
		return 'The '+langString.arguments[1]+' field must be '+langString.arguments[2]+' characters long';
	}
	if (stringNumber == 'checkMinLength') {
		return 'The '+langString.arguments[1]+' field must be at least '+langString.arguments[2]+' characters long';
	}
	if (stringNumber == 'checkMaxLength') {
		return 'The '+langString.arguments[1]+' field must be less than '+langString.arguments[2]+' characters.  It is currently '+langString.arguments[3]+' characters long.';
	}
	if (stringNumber == 'checkValidDate') {
		return 'The '+langString.arguments[1]+' field is not a proper date';
	}
	if (stringNumber == 'checkAge') {
		return 'The '+langString.arguments[1]+' must be at least '+langString.arguments[2]+' years old';
	}
	if (stringNumber == 'zipPostal') {
		return 'The '+langString.arguments[1]+' field does not appear to be in the correct format';
	}
	if (stringNumber == 'checkLow') {
		return 'The '+langString.arguments[1]+' field must be higher than '+langString.arguments[2];
	}
	if (stringNumber == 'checkHigh') {
		return 'The '+langString.arguments[1]+' field must be lower than '+langString.arguments[2];
	}
	if (stringNumber == 'checkEmail') {
		return 'The '+langString.arguments[1]+' field is not a valid email address';
	}
	if (stringNumber == 'checkLongLat') {
		return 'The '+langString.arguments[1]+' field is not a proper co-ordinate.  It should be in the format 99[n,s,e,w]99.99';
	}
	if (stringNumber == 'checkPasswordMatch') {
		return 'The Password fields do not match';
	}
	if (stringNumber == 'checkPasswordLength') {
		return 'Your password must be greater then '+langString.arguments[1]+' characters';
	}
}
