//
// XtraSite - Form Validation
// v3.9
// (c) Xtranet Multimedia Ltd, 2002-2007
// www.xtranet.co.uk
//
// Usage
//	1. Include this file as JavaScript (eg. <script language="JavaScript" src="/common/XtraSite-FormValidation/XtraSite-FormValidation.js"></script>)
//	2. Add an onSubmit event to the Form tag (eg. <form onSubmit="return ValidateForm(this)" name="Form1" method="get" action="nextstep.asp">) 
//	3. To each field you want validated, add:
//		a. required="yes", if you want to make it mandatory (eg. <input type="text" name="address" required="yes">)
//		b. validation="_name_", if you want to validate using the function _name_ [where _name_ must equate to a 
//			JavaScript function defined below as Validate_name_] (eg. input type="text" name="pc" validation="Postcode">).
//			If the function requires parameters passed to it then enclose them in brackets (eg. input type="text" name="qty" validation="IntegerRange[0,100]">).

function ValidateForm(myform) {
	var i;
	var FieldOK = new Array();
	var key;
	var usermsg;
	var params;
	var validationFunctionName;
	var validationFunctionParams;
	var re = /([^[]+)(\[(.+)\])?/;

	for (i=0; i<myform.elements.length; i++) {
		if (myform.elements[i].disabled) {
			continue;
		}
		if (myform.elements[i].style.border == 'red 2px solid') {
			myform.elements[i].style.border = 'threedshadow 2px solid';
		}
		if(myform.elements[i].getAttribute('validation') > '' && myform.elements[i].value != '') {
			params = myform.elements[i].getAttribute('validation').match(re);
			validationFunctionName = params[1];
			if (params[3] == '') {
				validationFunctionParams = '("' + myform.elements[i].value + '")'
			}
			else {
				validationFunctionParams = '("' + myform.elements[i].value + '",' + params[3] + ')';
			}
			try {
				if ( !eval('Validate' + validationFunctionName + validationFunctionParams) ) {
					TellUser('Please enter a valid format for this field', myform.elements[i]);
					return false;
				}
			}
			catch(e) {
					TellUser('Programming error. Validation function ' + validationFunctionName + ' does not exist', myform.elements[i]);
					return false;
			}
		}

		if(myform.elements[i].getAttribute('required') == 'yes' || myform.elements[i].getAttribute('required') == true) {
			if (FieldOK[myform.elements[i].name] >= 0 || FieldOK[myform.elements[i].name]+'' == 'undefined') {
				FieldOK[myform.elements[i].name] = i;
				switch (myform.elements[i].type) {
					case 'checkbox' :
					case 'radio' :
						if(myform.elements[i].checked == true) {
							FieldOK[myform.elements[i].name] = -1;
						}
						break;
					case 'text' :
					case 'textarea' :
					case 'file' :
					case 'password' :
					case 'select-multiple' :
					case 'select-one' :
					default :
						if (myform.elements[i].value != '') {
							FieldOK[myform.elements[i].name] = -1;
						}
						break;
				}
			}
		}
		if(myform.elements[i].getAttribute('compare')) {
			if(myform.elements[i].value != myform.elements[myform.elements[i].getAttribute('compare')].value) {
				TellUser('Fields must be the same', myform.elements[i]);
				return false;
			}
		}
	}

	for (key in FieldOK) {
		if (FieldOK[key] != -1) {
			switch (myform.elements[FieldOK[key]].type) {
				case 'checkbox' :
				case 'radio' :
					usermsg = 'You must select an option';
					break;
				case 'select-multiple' :
					usermsg = 'You must choose at least one item from the list';
					break;
				case 'select-one' :
					usermsg = 'You must choose an item from the list';
					break;
				case 'text' :
				case 'textarea' :
				case 'file' :
				case 'password' :
				default :
					usermsg = 'This field cannot be blank';
					break;
			}
			TellUser(usermsg, myform.elements[FieldOK[key]]);
			return false;
		}
	}

	return true;
}

function TellUser(msg, obj) {
	try {
		alert(obj.name + ': ' + msg);
	}
	catch(e) {
		alert(msg);
	}
	try {
		//var spannode = document.createElement("span");
		//obj.parentNode.insertBefore(spannode);
		obj.style.border = 'red 2px solid';
		obj.focus();
	}
	catch(e) {
	}
}

////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////   Validation routines   //////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////

function ValidatePostcode(inputstring) {
	// var regexp = /^[a-zA-Z]{1,2}[0-9][0-9A-Za-z]{0,1} {0,1}[0-9][A-Za-z]{2}$/;
	var regexp = /^[a-z]{1,2}[0-9][0-9a-z]{0,1} [0-9][a-z]{2}$/i;
	return regexp.test(inputstring);
}

function ValidateEmail(inputstring) {
	// var regexp = /^[a-z0-9]([a-z0-9_\-\.]*)@([a-z0-9_\-\.]*)(\.[a-z]{2,3}(\.[a-z]{2}){0,2})$/i;
	// var regexp = /^[\w\-\.]+\@[\w\-]+(\.[\w\-]+)+\s*$/i;
	// var regexp = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,7})+$/i;
	// var regexp = /^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-z]{2,7}$/i;
	var regexp = /^[a-z0-9_-]+(\.[a-z0-9_-]+)*@([a-z0-9_-]+\.)+[a-z]{2,7}$/i;
	return regexp.test(inputstring);
}

function ValidateCurrency(inputstring) {
	var regexp = /(^\£\d{1,3}(,\d{3})*\.\d{2}$)|(^\(\£\d{1,3}(,\d{3})*\.\d{2}\)$)/;
	return regexp.test(inputstring);
}

function ValidateTime(inputstring) {
	var regexp = /^\d{1,2}:\d{1,2}(:\d{1,2})?$/i;
	if (!regexp.test(inputstring)) {
		return false;
	}
	var part = inputstring.split(':')
	try {
		testDate = new Date('1/1/2000 ' + inputstring);
		if (testDate.getHours() == part[0] && testDate.getMinutes() == part[1] && (part[2] ? testDate.getSeconds() == part[2] : true)) {
			return true;
		}
	}
	catch (e) {
	}
	return false;
}

function ValidateFloatRange(inputstring, lowerRange, upperRange) {
	if (!ValidateFloat(inputstring) || inputstring < lowerRange || inputstring > upperRange) {
		return false;
	}
	return true;
}

function ValidateFloat(inputstring) {
	var regexp = /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;
	return regexp.test(inputstring);
}

function ValidateIntegerRange(inputstring, lowerRange, upperRange) {
	if (!ValidateInteger(inputstring) || inputstring < lowerRange || inputstring > upperRange) {
		return false;
	}
	return true;
}

function ValidateInteger(inputstring) {
	var regexp = /(^-?\d\d*$)/;
	return regexp.test(inputstring);
}

function ValidateDate(inputstring) {
	var regexp = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
	if (!regexp.test(inputstring)) {
		return false;
	}
	else {
		var part = inputstring.split('/')
		try {
			testDate = new Date(part[1]+'/'+part[0]+'/'+part[2]);
			if (testDate.getDate() != part[0] || testDate.getMonth()+1 != part[1] || testDate.getFullYear() != part[2]) {
				return false;
			}
		}
		catch (e) {
			return false;
		}
	}
	return true;
}

function ValidatePhone(inputstring) {
	var regexp = /^\+?(\(?\d( |-|\))*){10,}$/;
	return regexp.test(inputstring);
}

function ValidateNTusername(inputstring) {
	if (inputstring.length < 6 || inputstring.length > 20) return false;
	var regexp = /[(;:"<>*+=\|?,)\/]/;
	return !regexp.test(inputstring);
}

function ValidateURL(inputstring) {
	if (inputstring.substr(0,4).toLowerCase() == 'www.') {
		inputstring = 'http://' + inputstring;
	}
	//var regexp = /^(http|https|ftp)\:\/\/[a-z0-9\-\.]+\.[a-z]{2,3}(:[a-z0-9]*)?\/?([a-z0-9\-\._\?\,\'\/\\\+&%\$#\=~])*[^\.\,\)\(\s]$/i;
	//var regexp = /^(http|https|ftp)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?\/?([a-zA-Z0-9\-\._\?\,\'\/\\\+&%\$#\=~])*$/i
	//var regexp = /(http|ftp|https):\/\/[\w]+(.[\w]+)([\w\-\.,@?^=%&:\/~\+#]*[\w\-\@?^=%&\/~\+#])?/i
	var regexp = /http:\/\/([\w-]+\.)+[\w-]+(\/[\w- .\/?%&=]*)?/i
	return regexp.test(inputstring);
}

function ValidateYN(inputstring) {
	var regexp = /^\s*(y|n)\s*$/i;
	return regexp.test(inputstring);
}

function ValidateCreditCard(inputstring, cardtype) {
	var rePattern;
	var checksum = 0;
	var ccnum;
	var isDigit;

	ccnum = inputstring.replace(/[^0-9]/g,"");

	if(ccnum == "" || cardtype == "") {
		return false;
	}

	if(cardtype == "Visa") {
		rePattern = /^4\d{3}\d{4}\d{4}\d{4}$/;
	}
	if(cardtype == "MasterCard") {
		rePattern = /^5[1-5]\d{2}\d{4}\d{4}\d{4}$/;
	}
	if(cardtype == "Disc") {
		rePattern = /^6011\d{4}\d{4}\d{4}$/;
	}
	if(cardtype == "AmEx") {
		rePattern = /^3[4,7]\d{13}$/;
	}
	if(cardtype == "Diners") {
		rePattern = /^3[0,6,8]\d{12}$/;
	}

	if(!rePattern.test(ccnum)) {
		return false;
	}

	for(i=(2-(ccnum.length % 2)); i<=ccnum.length; i+=2) {
		checksum += parseInt(ccnum.charAt(i-1));
	}
	for (i=(ccnum.length % 2) + 1; i<ccnum.length; i+=2) {
		isDigit = parseInt(ccnum.charAt(i-1)) * 2;
		isDigit < 10 ? checksum += isDigit : checksum += (isDigit-9)
	}
	if ((checksum % 10) != 0) {
		return false;
	}
	return true;
}

