	var digits = "0123456789";
	var phoneNumberDelimiters = "()- ";
	var validPhoneChars = digits + phoneNumberDelimiters;
	var digitsInPhoneNumber = 10;
	var digitsInExtension = 6;
	var decimalPointDelimiter = ".";
	
	String.prototype.LTrim = function () { return this.replace(/^\s*/, "");}
	String.prototype.RTrim = function () { return this.replace(/\s*$/, "");}
	String.prototype.Trim  = function () { return this.LTrim().RTrim(); }
	String.prototype.ReplaceComma = function () { return this.replace(/,/gi," ");}
	String.prototype.ReplaceHyphen = function () { return this.replace(/-/gi," ");}
	String.prototype.ReplaceFSlash = function () { return this.replace("/"," ");}
	String.prototype.ReplaceBSlash = function () { return this.replace(/\\/gi," ");}
	String.prototype.ReplacePeriod = function () { return this.replace(/./gi," ");}
	String.prototype.ReplaceWhite = function () { return this.replace("  "," ");}
	String.prototype.ParseDate  = function () { return this.ReplaceComma().ReplaceHyphen().ReplaceWhite(); }
	
	function ValidateForm(theForm, bFindForm) {
		var arrElements = theForm.elements;
		var intElementCount = arrElements.length;
		var IsMandatory;
		var intDataType;
		
		var MinValue;
		var MaxValue;
		var Val;
		
		document.body.style.cursor = "wait";
		for (var i = 0; i < intElementCount; i++)
			with (arrElements[i]) {
				if (arrElements[i].type != "hidden" && arrElements[i].type!='checkbox' && arrElements[i].type!='radio') 
				{
					arrElements[i].value = arrElements[i].value.Trim()
				}
				IsMandatory = arrElements[i].pMandatory;
				IsUDF = arrElements[i].pIsUDF;
				intDataType = arrElements[i].pDataType;

				//for UDF
				MinValue = arrElements[i].pMinValue;
				MaxValue = arrElements[i].pMaxValue;
				Val = arrElements[i].value;

				//if it is find form do not check mandatory constraint				
				if( bFindForm==null || bFindForm==false ) {
					//UDF mandatory field checking
					if (IsUDF == 1)
						if (arrElements[i].pUdfIsMandatory == 1)
							if (Val == "")
							{
								if (arrElements[i].pFunction != "") {
									eval(arrElements[i].pFunction);
								}	
								parent.MessagePopup('ERROR:', '<strong>' + arrElements[i].pLabel + '</strong> is a UDF mandatory field.',arrElements[i].pX,arrElements[i].pY,1,arrElements[i].name);
								document.body.style.cursor = "";
								return false;
							}
				
					if (IsMandatory == 1) {
						if (Val == "") {
							if (arrElements[i].pFunction != "") {
								eval(arrElements[i].pFunction);
							}
							parent.MessagePopup('ERROR:', '<strong>' + arrElements[i].pLabel + '</strong> is a mandatory field.',arrElements[i].pX,arrElements[i].pY,1,arrElements[i].name);
							document.body.style.cursor = "";
							return false;
						}
					}
				}
				if (Val != "" || IsUDF == 1) {
					switch(intDataType) {
						case "1":
							if (!isEmailAddress(Val)) {
								if (arrElements[i].pFunction != "") {
									eval(arrElements[i].pFunction);
								}	
								parent.MessagePopup('ERROR:', '<strong>' + parent.CleanMessage(Val) + '</strong> is not a valid email address, please try again.',arrElements[i].pX,arrElements[i].pY,1,arrElements[i].name);
								document.body.style.cursor = "";
								return false;
							}
							break
						case "2":
							if (!isNumeric(Val)) {
								if (arrElements[i].pFunction != "") {
									eval(arrElements[i].pFunction);
								}
								parent.MessagePopup('ERROR:', '<strong>' + parent.CleanMessage(Val) + '</strong> is not a valid numeric value, please try again.',arrElements[i].pX,arrElements[i].pY,1,arrElements[i].name);
								document.body.style.cursor = "";
								return false;
							}
							break
						case "3":
							if (!isInteger(Val)) {
								if (arrElements[i].pFunction != "") {
									eval(arrElements[i].pFunction);
								}
								parent.MessagePopup('ERROR:', '<strong>' + parent.CleanMessage(Val) + '</strong> is not a valid integer value, please try again.',arrElements[i].pX,arrElements[i].pY,1,arrElements[i].name);
								document.body.style.cursor = "";
								return false;
							}
							break
						case "4":
							if (!isPhone(arrElements[i])) {
								if (arrElements[i].pFunction != "") {
									eval(arrElements[i].pFunction);
								}
								parent.MessagePopup('ERROR:', '<strong>' + parent.CleanMessage(Val) + '</strong> is not a valid phone number format, please try again.',arrElements[i].pX,arrElements[i].pY,1,arrElements[i].name);
								document.body.style.cursor = "";
								return false;
							}
							break
						case "5":
							if (!isAlpha(Val)) {
								if (arrElements[i].pFunction != "") {
									eval(arrElements[i].pFunction);
								}
								parent.MessagePopup('ERROR:', '<strong>' + parent.CleanMessage(Val) + '</strong> contains characters that are not alphabetic (a-z), please try again.',arrElements[i].pX,arrElements[i].pY,1,arrElements[i].name);
								document.body.style.cursor = "";
								return false;
							}
							break
						case "6":
							if (!isCurrency(arrElements[i])) {
								if (arrElements[i].pFunction != "") {
									eval(arrElements[i].pFunction);
								}
								parent.MessagePopup('ERROR:', '<strong>' + parent.CleanMessage(Val) + '</strong> is not a valid currency format, please try again.',arrElements[i].pX,arrElements[i].pY,1,arrElements[i].name);
								document.body.style.cursor = "";
								return false;
							}
							break
						case "7":
							if(arrElements[i].pIsUDF=='1')
							{					
								//UDF date
								if (!isDate(Val))
								{
									if (arrElements[i].pFunction != "") {
										eval(arrElements[i].pFunction);
									}
									parent.MessagePopup('ERROR:', '<strong>' + parent.CleanMessage(arrElements[i].pLabel) + '</strong> is not a valid date. Either the date is invalid or the format is incorrect (mm/dd/yyyy), please try again.',arrElements[i].pX,arrElements[i].pY,1,arrElements[i].name);
									document.body.style.cursor = "";
									return false;
								}
								else if( bFindForm==null || bFindForm==false )
								{
									//convert from string to date
									var MinDate = new Date(MinValue);
									var MaxDate = new Date(MaxValue);
									var ValDate = new Date(Val);

									if (ValDate < MinDate && MaxValue == '' && MinValue != '')
									{
										if (arrElements[i].pFunction != "") {
											eval(arrElements[i].pFunction);
										}
										parent.MessagePopup('ERROR:', '<strong>' + arrElements[i].pLabel + '</strong>, must be greater or equal to ' + MinValue + ', please try again.', arrElements[i].pX,arrElements[i].pY,1,arrElements[i].name);
										document.body.style.cursor = "";
										return false;
									}
									if (ValDate > MaxDate && MaxValue != '' && MinValue == '')
									{
										if (arrElements[i].pFunction != "") {
											eval(arrElements[i].pFunction);
										}
										parent.MessagePopup('ERROR:', '<strong>' + arrElements[i].pLabel + '</strong>, must be less than or equal to ' + MaxValue + ', please try again.', arrElements[i].pX,arrElements[i].pY,1,arrElements[i].name);
										document.body.style.cursor = "";
										return false;
									}
									if ((ValDate < MinDate || ValDate > MaxDate) && MinValue != '' && MaxValue != '')
									{
										if (arrElements[i].pFunction != "") {
											eval(arrElements[i].pFunction);
										}
										parent.MessagePopup('ERROR:', '<strong>' + parent.CleanMessage(arrElements[i].pLabel) + '</strong>, must be between ' + MinValue + ' and ' + MaxValue + ', please try again.', arrElements[i].pX,arrElements[i].pY,1,arrElements[i].name);
										document.body.style.cursor = "";
										return false;
									}
								}
							}
							else	
							{
								if (!isDate(Val)) {
									if (arrElements[i].pFunction != "") {
										eval(arrElements[i].pFunction);
									}
									parent.MessagePopup('ERROR:', '<strong>' + parent.CleanMessage(Val) + '</strong> is not a valid date. Either the date is invalid or the format is incorrect (mm/dd/yyyy), please try again.',arrElements[i].pX,arrElements[i].pY,1,arrElements[i].name);
									document.body.style.cursor = "";
									return false;
								}
							}
							break
						case "8":
							//UDF string
							if(arrElements[i].pIsUDF=='1' && (bFindForm==null || bFindForm==false) )
							{
								if (Val.length < MinValue && MaxValue == '' && MinValue != '')
								{
									if (arrElements[i].pFunction != "") {
										eval(arrElements[i].pFunction);
									}
									parent.MessagePopup('ERROR:', '<strong>' + arrElements[i].pLabel + '</strong>, must be greater than or equal to ' + MinValue + ' characters, please try again.', arrElements[i].pX,arrElements[i].pY,1,arrElements[i].name);
									document.body.style.cursor = "";
									return false;
								}
								if (Val.length > MaxValue && MaxValue != '' && MinValue == '')
								{
									if (arrElements[i].pFunction != "") {
										eval(arrElements[i].pFunction);
									}
									parent.MessagePopup('ERROR:', '<strong>' + arrElements[i].pLabel + '</strong>, must be less than or equal to ' + MaxValue + ' characters, please try again.', arrElements[i].pX,arrElements[i].pY,1,arrElements[i].name);
									document.body.style.cursor = "";
									return false;
								}
								if ((Val.length < MinValue || Val.length > MaxValue) && MinValue != '' && MaxValue != '')
								{
									if (arrElements[i].pFunction != "") {
										eval(arrElements[i].pFunction);
									}
									parent.MessagePopup('ERROR:', '<strong>' + parent.CleanMessage(arrElements[i].pLabel) + '</strong>, must be between ' + MinValue + ' and ' + MaxValue + ' characters, please try again.', arrElements[i].pX,arrElements[i].pY,1,arrElements[i].name);
									document.body.style.cursor = "";
									return false;									
								}
							}
							break
						case "9":
							if (!isValidDateTime(Val)) {
								if (arrElements[i].pFunction != "") {
									eval(arrElements[i].pFunction);
								}
								parent.MessagePopup('ERROR:', '<strong>' + parent.CleanMessage(Val) + '</strong> is not a valid Date and Time. Either the date and time is invalid or the format is incorrect (mm/dd/yyyy hh:mm AM|PM or mm/dd/yyyy hh:mm:ss AM|PM), please try again.',arrElements[i].pX,arrElements[i].pY,1,arrElements[i].name);
								document.body.style.cursor = "";
								return false;
							}
							break		
						case "10":
							if(arrElements[i].pIsUDF=='1')
							{
								//UDF number
								var DecDigit = arrElements[i].pDecimalDigits;
								if(DecDigit=='')
									DecDigit=0;
									
								if (!isNumeric(Val) && Val != '')
								{
									if (arrElements[i].pFunction != "") {
										eval(arrElements[i].pFunction);
									}
									parent.MessagePopup('ERROR:', '<strong>' + parent.CleanMessage(arrElements[i].pLabel) + '</strong> is not a valid numeric value, please try again.', arrElements[i].pX,arrElements[i].pY,1,arrElements[i].name);
									document.body.style.cursor = "";
									return false;
								}
								else if( bFindForm==null || bFindForm==false  )
								{
									//for only min has a value
									if (parseFloat(Val) < MinValue && MaxValue == '' && MinValue != '')
									{
										if (arrElements[i].pFunction != "") {
											eval(arrElements[i].pFunction);
										}
										parent.MessagePopup('ERROR:', '<strong>' + parent.CleanMessage(arrElements[i].pLabel) + '</strong>, must be greater or equal to ' + MinValue + ', please try again.', arrElements[i].pX,arrElements[i].pY,1,arrElements[i].name);
										document.body.style.cursor = "";
										return false;									
									}
									//for only max has a value
									if (parseFloat(Val) < MaxValue && MaxValue != '' && MinValue == '')
									{
										if (arrElements[i].pFunction != "") {
											eval(arrElements[i].pFunction);
										}
										parent.MessagePopup('ERROR:', '<strong>' + parent.CleanMessage(arrElements[i].pLabel) + '</strong>, must be less than or equal to ' + MaxValue + ', please try again.', arrElements[i].pX,arrElements[i].pY,1,arrElements[i].name);
										document.body.style.cursor = "";
										return false;									
									}
									//for both min & max has a value
									if ((parseFloat(Val) < MinValue || parseFloat(Val) > MaxValue) && MinValue != '' && MaxValue != '')
									{
										if (arrElements[i].pFunction != "") {
											eval(arrElements[i].pFunction);
										}
										parent.MessagePopup('ERROR:', '<strong>' + parent.CleanMessage(arrElements[i].pLabel) + '</strong>, must be between ' + MinValue + ' and ' + MaxValue + ', please try again.', arrElements[i].pX,arrElements[i].pY,1,arrElements[i].name);
										document.body.style.cursor = "";
										return false;									
									}
									if (Val.substring(0, Val.indexOf(".")) != "") {
										if (Val.substring(Val.indexOf(".") + 1, Val.length).length > DecDigit && DecDigit > 0)
										{	
											if (arrElements[i].pFunction != "") {
												eval(arrElements[i].pFunction);
											}
											parent.MessagePopup('ERROR:', '<strong>' + parent.CleanMessage(arrElements[i].pLabel) + '</strong>, must be less than or equal to ' + DecDigit + ' decimal point, please try again.', arrElements[i].pX,arrElements[i].pY,1,arrElements[i].name);
											document.body.style.cursor = "";
											return false;									
										}
										if (DecDigit == 0)
										{	
											if (arrElements[i].pFunction != "") {
												eval(arrElements[i].pFunction);
											}
											parent.MessagePopup('ERROR:', 'No decimal point are allowed for ' + '<strong>' + parent.CleanMessage(arrElements[i].pLabel) + '</strong>' + ', please try again.', arrElements[i].pX,arrElements[i].pY,1,arrElements[i].name);
											document.body.style.cursor = "";
											return false;									
										}
									}
								}		
							}
							else
							{
								if (!isNumeric(Val))
								{
									if (arrElements[i].pFunction != "") {
										eval(arrElements[i].pFunction);
									}
									parent.MessagePopup('ERROR:', '<strong>' + parent.CleanMessage(arrElements[i].pLabel) + '</strong> is not a valid numeric value, please try again.', arrElements[i].pX,arrElements[i].pY,1,arrElements[i].name);
									document.body.style.cursor = "";
									return false;
								}
							}
							break
					}
				}
			}
		ChangeStatus(false);	
		document.body.style.cursor = "";
		return true;
	}
		
	function isAlpha(string) {
		var objRegExp = /^[A-Za-z]+/
		
		return objRegExp.test(string);
	}
	
	function isBlank(string) {
		string = string.Trim();
		return string
	}

	function isDate(object) {
		var strDatestyle = "US";
		var strDate;
		var strDateArray;
		var strDay;
		var strMonth;
		var strYear = "";
		var intday;
		var intMonth;
		var intYear;
		var booFound = false;
		var datefield = object;
		var strSeparatorArray = new Array("-"," ","/",".");
		var intElementNr;
		var err = 0;
		var strMonthArrayLong = new Array(12);
			strMonthArrayLong[0] = "January";
			strMonthArrayLong[1] = "February";
			strMonthArrayLong[2] = "March";
			strMonthArrayLong[3] = "April";
			strMonthArrayLong[4] = "May";
			strMonthArrayLong[5] = "June";
			strMonthArrayLong[6] = "July";
			strMonthArrayLong[7] = "August";
			strMonthArrayLong[8] = "September";
			strMonthArrayLong[9] = "October";
			strMonthArrayLong[10] = "November";
			strMonthArrayLong[11] = "December";
			
			if (typeof(object) == "object") {
				strDate = datefield.value;
			}
			else 
			{
				strDate = object;
			}
		
		strDate = strDate.ParseDate();
	
		if (strDate.length < 1) {
			return true;
		}
		for (intElementNr = 0; intElementNr < strSeparatorArray.length; intElementNr++) {
			if (strDate.indexOf(strSeparatorArray[intElementNr]) != -1) {
				strDateArray = strDate.split(strSeparatorArray[intElementNr]);
				if (strDateArray.length != 3) {
					err = 1;
					return false;
				}
			else {
				strDay = strDateArray[0];
				strMonth = strDateArray[1];
				strYear = strDateArray[2];
			}
			booFound = true;
		   }
		}
		if (booFound == false) {
			if (strDate.length > 5) {
				strDay = strDate.substr(0, 2);
				strMonth = strDate.substr(2, 2);
				strYear = strDate.substr(4);
			}
		}
		if (isNaN(strYear)) {
			return false;
		}
		else if (strYear.length == 1 || strYear.length == 3) {
			return false;
		}
		else if (strYear.length > 4) {
			return false;
		}
		else if (strYear.length == 2) {
			if (strYear <= 49) {
				strYear = '20' + strYear;
			}
			else {
				strYear = '19' + strYear;
			}
		}
			
		if (strDatestyle == "US") {
			strTemp = strDay;
			strDay = strMonth;
			strMonth = strTemp;
		}
		intday = parseInt(strDay, 10);
		if (isNaN(intday)) {
			err = 2;
			return false;
		}
		intMonth = parseInt(strMonth, 10);
		if (isNaN(intMonth)) {
			for (i = 0;i<12;i++) {
				intMatch = strMonthArrayLong[i].toUpperCase().indexOf(strMonth.toUpperCase());
				if (intMatch != -1) {
					intMonth = i+1;
					strMonth = strMonthArrayLong[i];
					i = 12;
				}
			}
			if (isNaN(intMonth)) {
			err = 3;
			return false;
		   }
		}
		intYear = parseInt(strYear, 10);
		if (isNaN(intYear)) {
			err = 4;
			return false;
		}
		if (intMonth>12 || intMonth<1) {
			err = 5;
			return false;
		}
		if ((intMonth == 1 || intMonth == 3 || intMonth == 5 || intMonth == 7 || intMonth == 8 || intMonth == 10 || intMonth == 12) && (intday > 31 || intday < 1)) {
			err = 6;
			return false;
		}
		if ((intMonth == 4 || intMonth == 6 || intMonth == 9 || intMonth == 11) && (intday > 30 || intday < 1)) {
			err = 7;
			return false;
		}
		if (intMonth == 2) {
			if (intday < 1) {
			err = 8;
			return false;
		}
		if (LeapYear(intYear) == true) {
			if (intday > 29) {
				err = 9;
				return false;
			}
		}
		else {
			if (intday > 28) {
				err = 10;
				return false;
			}
		}
		}
		if (intday < 10) {
			intday = "0" + intday;
		}
		if (intMonth < 10) {
			intMonth = "0" + intMonth;
		}
		if (strDatestyle == "US") {
			datefield.value = intMonth + "/" + intday + "/" + strYear;
		}
		else {
			datefield.value = intday + "/" + intMonth + "/" + strYear;
		}
		return true;
		}
	
		function LeapYear(intYear) {
			if (intYear % 100 == 0) {
			if (intYear % 400 == 0) { return true; }
		}
		else {
			if ((intYear % 4) == 0) { return true; }
		}
		return false;
		}

	function isEmailAddress(string) {
		var objRegExp = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;
				
		return objRegExp.test(string);
	}
	
	function isInteger(string) {
		var objRegExp  = /(^-?\d\d*$)/;
		
		return objRegExp.test(string);
	}
	
	function isNumeric(string) {
		var objRegExp  =  /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;
		
		return objRegExp.test(string);
	}

	function isPhone(object) {
		var phone = '';
		var ext = '';
		var digitsOnly = '';
			
		digitsOnly = stripCharsNotInBag(object.value, digits);		
		if (digitsOnly.length > 0) {
			
			if (digitsOnly.length < digitsInPhoneNumber) {
				return false;
			}
			else {
				phone = reformat(digitsOnly.substring(0, digitsInPhoneNumber), '(', 3, ') ', 3, '-', 4);
				ext = digitsOnly.substring(digitsInPhoneNumber, digitsInPhoneNumber+digitsInExtension);
				if (ext.length == 0) 
					object.value = phone;
				else
					object.value = phone + " x" + ext;
				return true;	
			}
		}	
		else {
			
			if (object.value.length > 0) {
				return false;	
			}	
		}		
	}
	
	function stripCharsNotInBag(s, bag) {
		var i;
		var returnString = "";

		for (i = 0; i < s.length; i++) {   
			var c = s.charAt(i);
			
			if (bag.indexOf(c) != -1) returnString += c;
		}
		
    return returnString;
	}

	function stripCharsInBag(s, bag) {
		var i;
		var returnString = "";
		
		for (i = 0; i < s.length; i++) {
			var c = s.charAt(i);
			
			if (bag.indexOf(c) == -1) returnString += c;
		}

		return returnString;
	}
	
	function reformat(s) {
		var arg;
		var sPos = 0;
		var resultString = "";
		
		for (var i = 1; i < reformat.arguments.length; i++) {
			arg = reformat.arguments[i];
			if (i % 2 == 1) resultString += arg;
			else {
				resultString += s.substring(sPos, sPos + arg);
				sPos += arg;
			}
		}
		
    return resultString;
	}
	
	function isCurrency(object) {
		var string = object.value;
		
		string = string.toString().replace(/\$|\,/g,'');
		
		if(isNaN(string)) {
			return false;
		}
		else {
			var sign = (string == (string = Math.abs(string)));
			string = Math.floor(string*100+0.50000000001);
			var	cents = string%100;
			string = Math.floor(string/100).toString();
			if(cents < 10) { cents = "0" + cents };
			for (var i = 0; i < Math.floor((string.length-(1+i))/3); i++) {
				string = string.substring(0,string.length-(4*i+3))+','+
				string.substring(string.length-(4*i+3));
		}
			
		object.value = (((sign)?'':'-') + string + '.' + cents);
		return true;
		}
	}