	function strreplace(sString, sTarget, sReplace){
		var sTemp = sString;
		var a = 0;
		for(i = 0; i < sString.length; i++){
			a = sTemp.indexOf(sTarget);
			sTemp = sTemp.substring(0 , a) + sReplace + sTemp.substring((a + sTarget.length));
			if (a == -1){
				break;
			}
		}
		return sTemp;
	}

	function trim(sValue){
		while(sValue.substring(0, 1)==' '){
			sValue = sValue.substring(1, sValue.length);
		}
		while (sValue.substring(sValue.length-1, sValue.length) == ' '){
			sValue = sValue.substring(0, sValue.length - 1);
		}
		return sValue;
	}

	function isDate(oField){
		var sValue = trim(oField.value);
		var sRegex = /^(((0[1-9]|[12][0-9]|3[01])([\/])(0[13578]|10|12)([\/])(\d{4}))|(([0][1-9]|[12][0-9]|30)([\/])(0[469]|11)([\/])(\d{4}))|((0[1-9]|1[0-9]|2[0-8])([\/])(02)([\/])(\d{4}))|((29)(\.|-|\/)(02)([\/])([02468][048]00))|((29)([\/])(02)([\/])([13579][26]00))|((29)([\/])(02)([\/])([0-9][0-9][0][48]))|((29)([\/])(02)([\/])([0-9][0-9][2468][048]))|((29)([\/])(02)([\/])([0-9][0-9][13579][26])))$/;
		return(sRegex.test(sValue));
	}

	function isURL(oField){
		var sValue = trim(oField.value);
		var sRegex  = /^(http:\/\/www.|https:\/\/www.|www.){1}([a-zA-Z0-9\-\/.]+)([\&\?\=\%a-zA-Z0-9]+)?$/;
		return(sRegex.test(sValue));
	}

	function isEmail(oField){
		var sValue = trim(oField.value);
		var sRegex  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
		return(sRegex.test(sValue));
	}

	function isInteger(oField){
		var sValue = trim(oField.value);
		var sRegex = /^(\+|-)?\d+$/;
		return(sRegex.test(sValue));
	}

	function isPositiveInteger(oField){
		var sValue = trim(oField.value);
		var sRegex = /^\d+$/;
		return(sRegex.test(sValue));
	}

	function isAlphaNumeric(oField){
		var sValue = trim(oField.value);
		var sRegex = /^[a-zA-Z0-9]+$/;
		return(sRegex.test(sValue));
	}

	function isPassword(oField){
		var sValue = trim(oField.value);
		var sRegex = /^[a-zA-Z0-9]{6,10}$/;
		return(sRegex.test(sValue));
	}

	/* Validates name - may include spaces, &s, special characters etc */
	function isName(oField){
		var sValue = trim(oField.value);
		var sRegex = /^([ \u00c0-\u01ffa-zA-Z\&'])+$/;
		return(sRegex.test(sValue));
	}

	function isTel(oField){
		var sValue = trim(oField.value);
		var sRegex = /^[\(\)\.\+\-\, a-zA-Z0-9\/]+$/;
		return(sRegex.test(sValue));
	}

	/* Validates address line - may include numbers, spaces, &s, special characters etc */
	function isAddress(oField){
		var sValue = trim(oField.value);
		var sRegex = /^([ \-\,\.0-9a-zA-Z\&'])+$/;
		return(sRegex.test(sValue));
	}

	function isLength(oField, nMinLength, nMaxLength){
		var sValue = trim(oField.value);
		var nValueLength = sValue.length;
		return(nValueLength >= nMinLength && nValueLength <= nMaxLength);
	}

	function isPostcode(oField){
		var sValue = strreplace(trim(oField.value), " ", "");
		var sRegex = /^([ \-\.0-9a-zA-Z])+$/;
		return(sRegex.test(sValue));
	}

	/* Validates body text (EG in textarea) - most characters allowed, inc. line breaks & tabs */
	function isBodyText(oField){
		var sValue = trim(oField.value);
		var sRegex = /^([a-zA-Z0-9 _\.\-\r\n\t\u00c0-\u01ff!|"'=\+\&\*£?<>#%\[\]@;:\(\)\,\/])+$/;
		return(sRegex.test(sValue));
	}

	function isHtml(oField){
		var sValue = oField.value;
		var sRegex = /<\S[^><]*>/;
		return(sRegex.test(sValue));
	}

	function isIPAddress(oField){
		var sValue = oField.value;
		var sRegex = /^(([0-2]*[0-9]+[0-9]+)\.([0-2]*[0-9]+[0-9]+)\.([0-2]*[0-9]+[0-9]+)\.([0-2]*[0-9]+[0-9]+))$/;
		return(sRegex.test(sValue));
	}

	/* Validates text - most characters allowed, no line breaks or tabs */
	function isText(oField){
		var sValue = oField.value;
		var sRegex = /^([a-zA-Z0-9 _\.\-\u00c0-\u01ff!"'=\+\&\*£?<>#%\[\]@;:\(\)\,\/])+$/;
		return(sRegex.test(sValue));
	}

	function isFilled(oField){
		var sValue = oField.value;
		return(trim(sValue) != '');
	}
