var validationErrorMessage = new Object();
validationErrorMessage['required'] = 'required';
validationErrorMessage['numeric'] = 'number required';
validationErrorMessage['postcode'] = 'zip code incorrect';
validationErrorMessage['phone'] = 'Incorrect phone';
validationErrorMessage['pattern'] = 'Pattern incorrect';
validationErrorMessage['email'] = 'Incorrect email address';
validationErrorMessage['pwmatch'] = 'Passwords do not match';
validationErrorMessage['date'] = 'Date is incorrect - use 00/00/0000';
validationErrorMessage['ssn'] = 'SSN is incorrect';
validationErrorMessage['CCard'] = 'number incorrect';
validationErrorMessage['eitheror'] = 'Must complete one field';
validationErrorMessage['currency'] = 'Must enter a dollar amount';


var validationFunctions = new Object();
validationFunctions["required"] = isRequired;
validationFunctions["pattern"] = isPattern;
validationFunctions["postcode"] = isPostCode;
validationFunctions["phone"] = isPhone;
validationFunctions["numeric"] = isnumeric;
validationFunctions["email"] = isEmail;
validationFunctions["pwmatch"] = isPWMatch;
validationFunctions["date"] = isDate;
validationFunctions["ssn"] = isSSN;
validationFunctions["CCard"] = isCCard;
validationFunctions["eitheror"] = isEitherOr;
validationFunctions["currency"] = isCurrency;

function isCCard(formField){
	var ccType = formField.value.toUpperCase;
	switch(ccType) {
		case 'AMEX':
			return isPattern(formField,"3[47][0-9]{13}");
			break;
		case 'VISA':
			return isPattern(formField,"4[0-9]{12}(?:[0-9]{3})?");
			break;
		case 'MC':
		case 'MASTERCARD':
			return isPattern(formField,"5[1-5][0-9]{14}");
			break;
		case 'DISC':	
		case 'DISCOVER':
			return isPattern(formField,"6(?:011|5[0-9]{2})[0-9]{12}");
			break;
		case 'DC':	
		case 'DINNERSCLUB':
			return isPattern(formField,"3(?:0[0-5]|[68][0-9])[0-9]{11}");
			break;
		case 'JCB':
			return isPattern(formField,"(?:2131|1800|35\\d{3})\\d{11}");
			break;
		case 'NA':
			return false;
			break;
		default:
			break;
	}
}

function isDate(formField){
	var myFlag = isEmpty(formField);
	if(myFlag){
		return myFlag;
	}else{
		return isPattern(formField,"[0-1][1-9][- / ]?(0[1-9]|[12][0-9]|3[01])[- /]?(18|19|20|21)\\d{2}");
	}
}

function isRequired(formField) {
	switch (formField.type) {
		case 'text':
		case 'password':
		case 'textarea':
		case 'select-one':
			if (formField.value.trim()){
				return true;
			}else{
				return false;
			}
		case 'radio':
		var radios = formField.form[formField.name];
		for (var i=0;i<radios.length;i++) {
			if (radios[i].checked) return true;
		}
		return false;
		case 'checkbox':
		return formField.checked;
	}	
}

function isPattern(formField,pattern) {
	var pattern = pattern || formField.getAttribute('pattern');
	//writeHistory(formField, "^"+pattern+"$")
	var regExp = new RegExp("^"+pattern+"$","");
	var correct = regExp.test(formField.value);
	if (!correct && formField.getAttribute('patternDesc'))
		correct = formField.getAttribute('patternDesc');
	return correct;
}

function isPostCode(formField) {
	var myFlag = isEmpty(formField);
	if(myFlag){
		return myFlag;
	}else{
		return isPattern(formField,"\\d{5}$|^\\d{5}-\\d{4}");
	}
}

function isCurrency(formField) {
	var myFlag = isEmpty(formField);
	if(myFlag){
		return myFlag;
	}else{
		return isPattern(formField,"[-+]?\\d{3,5}(\\.\\d{1,3})?");
	}
}

function isnumeric(formField) {
	var myFlag = isEmpty(formField);
	if(myFlag){
		return myFlag;
	}else{
		return isPattern(formField,"\\d+");
	}
}

function isEmail(formField) {
	var myFlag = isEmpty(formField);
	if(myFlag){
		return myFlag;
	}else{
		return isPattern(formField,"(?:\\w*\\.?)*\\w*@(?:\\w*\\.)*\\w*");
	}
	
}

function isPhone(formField){
	var myFlag = isEmpty(formField);
	if(myFlag){
		return myFlag;
	}else{
		return isPattern(formField,"\\(?(\\d{3})\\)?[- ]?(\\d{3})[- ]?(\\d{4})");
	}
}

function isSSN(formField){
	var myFlag = isEmpty(formField);
	if(myFlag){
		return myFlag;
	}else{
		return isPattern(formField,"[0-9]{3}\\-?[0-9]{2}\\-?[0-9]{4}");
	}
}

function isPWMatch(formField){
	var objForm = formField.form
	var pw1 = objForm[formField.name.replace("2", "")]
	var pw2 = formField
	return passwordVerify(pw1, pw2);
}

function isEmpty(formField){
	if (!formField.value){
		return true;
	}
	return false;
}

function isEitherOr(formField){
	var objForm = formField.form
	if (formField.value){
		return true;
	}else{
		var n = formField.name;
		var currentName;
		switch(n){
			case "FirstName":
				currentField = objForm.LastName
			  break;
			case "LastName":
				currentField = objForm.FirstName
			  break;
			default:
				currentField = formField
			
		}
		
		if (currentField.value)
			return true;
	}
}

function emptyFunction() {
	return true;
}

/*********************************/

var W3CDOM = document.createElement && document.getElementsByTagName;

function validateForms() {
	if (!W3CDOM) return;
	var forms = document.forms;
	for (var i=0;i<forms.length;i++) {
		addValidationFlag(forms[i]);
		forms[i].onsubmit = validate;
	}
}

addEventSimple(window,'load',validateForms);

// appends a hidden field to a validated form that we can reference in asp to verify javascript validated the form
function addValidationFlag(myForm){
	var ValidationFlag = document.createElement('INPUT');
	ValidationFlag.type = "hidden"
	ValidationFlag.value = "true"
	ValidationFlag.name = "ValidationFlag"
	myForm.appendChild(ValidationFlag)
}

function validate() {
	var els = this.elements;
	var validForm = true;
	var firstError = null;
	for (var i=0;i<els.length;i++) {
		if (els[i].removeError)
			els[i].removeError();
		var req = els[i].getAttribute('validation');
		if (!req) continue;
		var reqs = req.split(' ');
		if (els[i].getAttribute('pattern'))
			reqs[reqs.length] = 'pattern';
		for (var j=0;j<reqs.length;j++) {
			if (!validationFunctions[reqs[j]])
				validationFunctions[reqs[j]] = emptyFunction;
				var OK = validationFunctions[reqs[j]](els[i]);
			if (OK != true) {
				var errorMessage = OK || validationErrorMessage[reqs[j]];
				writeError(els[i],errorMessage)
				validForm = false;
				if (!firstError)
					firstError = els[i];
				break;
			}
		}
	}

	if (!validForm) {
		showMessage("Errors have been found and identified on the form you submitted.", 400, 150);
		//location.hash = '#';
	}
	return validForm;
}

function writeError(obj,message) {
	obj.className += ' errorMessage';
	obj.onblur = removeError;
	obj.onchange = removeError;
	
	if (obj.errorMessage || obj.parentNode.errorMessage) return;
	var errorMessage = document.createElement('label');
	errorMessage.className = 'errorMessage';
	errorMessage.setAttribute('for',obj.id);
	errorMessage.setAttribute('htmlFor',obj.id);
	errorMessage.appendChild(document.createTextNode(message));
	obj.parentNode.appendChild(errorMessage);
	obj.errorMessage = errorMessage;
	obj.parentNode.errorMessage = errorMessage;
}

function removeError() {
	this.className = this.className.replace(/errorMessage/,'');
	if (this.errorMessage) {
		this.parentNode.removeChild(this.errorMessage);
		this.errorMessage = null;
		this.parentNode.errorMessage = null;
	}
	this.onchange = null;
}

function passwordVerify(pw1, pw2){
	var rtnFlag = false;
	if (pw1.value == pw2.value){
		rtnFlag = true;
	}
	return rtnFlag;
}

