function MM_findObj(n, d) { //v4.0
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && document.getElementById) x=document.getElementById(n); return x;
}

function ValidateForm() { //v1.0
	var i=new Number(),MyParam=new String(),MyObjString=new String(),MyFunc=new String(),MyNameString=new String(),args=new Array()
	args=ValidateForm.arguments;
	for (i=0; i<(args.length-3); i+=4) {
		MyFunc=args[i];
		MyParam=args[i+3];
		MyObjString=args[i+1];
		MyNameString=args[i+2];
		if (!(ValidateFunc(MyFunc,MyParam,MyObjString,MyNameString))) {
				return false;
		}
	}
return true;
}

function ValidateFunc(MyFunc,MyParam,MyObjString,MyNameString) {//v0.8b	
	var j=new Number(),MyObj=new Object(),MyName=new String(),MyRange=new String();
	switch (MyFunc) {
		case "C": //Comparison
			MyObjArray=MyObjString.split("|");
			var MyObj1=new Object(MM_findObj(MyObjArray[0]));
			var MyObj2=new Object(MM_findObj(MyObjArray[1]));
			MyName=MyNameString.split("|");
			switch (MyParam) {
				case  "DGT": // Date Greater Than
					if (MyObj1.value.indexOf("-")!=-1){
						var MyDateString=new String(MyObj1.value.replace(/ /ig,"-"));
						MyDateString=MyDateString.replace(/-/ig,"/");
						var MyDate = new Array();
						MyDate =MyDateString.split("/");
					}
					else {
						var MyDateString=new String(MyObj1.value.replace(/ /ig,"/"));
						var MyDate =new Array();
						MyDate =MyDateString.split("/");
					}
					if (MyObj2.value.indexOf("-")!=-1){
						var MyDateString1=new String(MyObj2.value.replace(/ /ig,"-"));
						MyDateString1=MyDateString1.replace(/-/ig,"/");
						var MyDate1 =new Array();
						MyDate1 =MyDateString1.split("/");
					}
					else {
						var MyDateString1=new String(MyObj2.value.replace(/ /ig,"/"));
						var MyDate1 =new Array();
						MyDate1 =MyDateString1.split("/");
					}
					MyDateString=new Date(MyDate[2],MyDate[1]-1,MyDate[0],MyDate[3]);
					MyDateString1=new Date(MyDate1[2],MyDate1[1]-1,MyDate1[0],MyDate1[3]);
					if (MyDateString>=MyDateString1) {
						alert("\"" + MyName[1] + "\" should be greater than \"" + MyName[0] + "\"!");
        					MyObj1.focus();
						return false;
					}
					break;
				case  "VGT": // Value Greater Than
					if (parseFloat(MyObj1.value)>=parseFloat(MyObj2.value)) {
						alert("\"" + MyName[1] + "\" should be greater than \"" + MyName[0] + "\"!");
        					MyObj1.focus();
						return false;
					}
					break;
				case  "DGE": // Date Greater than or Equal to
					if (MyObj1.value.indexOf("-")!=-1){
						var MyDateString=new String(MyObj1.value.replace(/ /ig,"-"));
						MyDateString=MyDateString.replace(/-/ig,"/");
						var MyDate =new Array();
						MyDate =MyDateString.split("/");
					}
					else {
						var MyDateString=new String(MyObj1.value.replace(/ /ig,"/"));
						var MyDate =new Array();
						MyDate =MyDateString.split("/");
					}
					if (MyObj2.value.indexOf("-")!=-1){
						var MyDateString1=new String(MyObj2.value.replace(/ /ig,"-"));
						MyDateString1=MyDateString1.replace(/-/ig,"/");
						var MyDate1 =new Array();
						MyDate1 =MyDateString1.split("/");
					}
					else {
						var MyDateString1=new String(MyObj2.value.replace(/ /ig,"/"));
						var MyDate1 =new Array();
						MyDate1 =MyDateString1.split("/");
					}
					MyDateString=new Date(MyDate[2],MyDate[1]-1,MyDate[0],MyDate[3]);
					MyDateString1=new Date(MyDate1[2],MyDate1[1]-1,MyDate1[0],MyDate1[3]);
					if (MyDateString>MyDateString1) {
						alert("\"" + MyName[1] + "\" should be greater than or equal to \"" + MyName[0] + "\"!");
        					MyObj1.focus();
						return false;
					}
					break;
				case  "VGE": // Value Greater than or Equal to
					if (parseFloat(MyObj1.value)>parseFloat(MyObj2.value)) {
						alert("\"" + MyName[1] + "\" should be greater than or equal to \"" + MyName[0] + "\"!");
        					MyObj1.focus();
						return false;
					}
					break;
				}
			break;
		case "E": //File Extension
			MyObj=MM_findObj(MyObjString);
			var MyExt=new Array();
			MyExt=MyParam.split("|");
			var chkFileExt=new String();
			MyName=MyNameString;
			if (MyObj.value.length!=0) {
				var FileExt_Error=new Number(1);
				var pattern=new String();
 				for (var k=0; k<(MyExt.length); k++) {
 					pattern="." + MyExt[k];
 					chkFileExt=MyObj.value.slice(MyObj.value.length-pattern.length);
 					if (chkFileExt.toLowerCase() == pattern) {
	 					FileExt_Error=0;
 					}
 				}
 				if (FileExt_Error!=0) {
 			        	alert("Invalid file extension in \"" + MyName + "\"!");
     					MyObj.focus();
					return false;
				}
			}
			break;
		case "G": //Group
			var Neg=new Number(),k=new Number(),MyLength=new Number(),MyString=new String(),MyGroup=new String(),MyGroupValue=new Number(),MyValue=new Number(),MyFocus=new Object(),MyFocusValue=new Number(),NewString=new String();;
			var pattern =new RegExp("[ \f\n\r\t\v]","g");
			var MyGroupObj=new Array();
			MyObjArray=MyObjString.split("|");
			MyName=MyNameString;
			MyFocusValue=0;
			MyValue=0;
			for (j=0; j<(MyObjArray.length); j++) {
				MyGroup=MyObjArray[j].split(":");
				MyLength = MyGroup.length;
				MyGroupValue=1;
				for (k=0; k<MyLength; k++) {
					Neg=0;
					if (MyGroup[k].search(/^!/) != -1)  {
						MyGroup[k]=MyGroup[k].substr(1)
						Neg=1;	
					}
					MyString = "MyGroupObj[k]=" + MyParam + "." + MyGroup[k] + ";";
					eval(MyString);
					if (MyFocusValue==0) {
						MyFocus=MyGroupObj[k];
						MyFocusValue=1;
					}
					if (Neg==0){
						switch (MyGroupObj[k].type) {
							case "radio":
								if (!(MyGroupObj[k].checked)) {
									MyGroupValue=0;	
								}
								break;
							case "checkbox":
								if (!(MyGroupObj[k].checked)) {
									MyGroupValue=0;	
								}
								break;
							case "textarea":
								NewString=MyGroupObj[k].value.replace(pattern,"");
								if (NewString.length==0) {
									MyGroupValue=0;
									MyGroupObj[k].value="";	
								}
								break;
							case "text":
								NewString=MyGroupObj[k].value.replace(pattern,"");
								if (NewString.length==0) {
									MyGroupValue=0;	
									MyGroupObj[k].value="";
								}
								break;
							case "file":
								NewString=MyGroupObj[k].value.replace(pattern,"");
								if (NewString.length==0) {
									MyGroupValue=0;	
									MyGroupObj[k].value="";
								}
								break;
							case "password":
								NewString=MyGroupObj[k].value.replace(pattern,"");
								if (NewString.length==0) {
									MyGroupValue=0;	
									MyGroupObj[k].value="";
								}
								break;
							case "select-one":
								if (MyGroupObj[k].selectedIndex==0) {
									MyGroupValue=0;	
								}
								break;
							case "select-multiple":
								if (MyGroupObj[k].selectedIndex==-1) {
									MyGroupValue=0;	
								}
								break;
							case "hidden":
								NewString=MyGroupObj[k].value.replace(pattern,"");
								if (NewString.length==0) {
									MyGroupValue=0;	
									MyGroupObj[k].value="";
								}
								break;
						}
					}
					else {
						switch (MyGroupObj[k].type) {
							case "radio":
								if (MyGroupObj[k].checked) {
									MyGroupValue=0;	
								}								
								break;
							case "checkbox":
								if (MyGroupObj[k].checked) {
									MyGroupValue=0;	
								}
								break;
							case "textarea":
								NewString=MyGroupObj[k].value.replace(pattern,"");
								if (NewString.length!=0) {
									MyGroupValue=0;	
								}
								else {
									MyGroupObj[k].value="";
								}
								break;
							case "text":
								NewString=MyGroupObj[k].value.replace(pattern,"");
								if (NewString.length!=0) {
									MyGroupValue=0;	
								}
								else {
									MyGroupObj[k].value="";
								}
								break;
							case "file":
								NewString=MyGroupObj[k].value.replace(pattern,"");
								if (NewString.length!=0) {
									MyGroupValue=0;	
								}
								else {
									MyGroupObj[k].value="";
								}
								break;
							case "password":
								NewString=MyGroupObj[k].value.replace(pattern,"");
								if (NewString.length!=0) {
									MyGroupValue=0;	
								}
								else {
									MyGroupObj[k].value="";
								}
								break;
							case "select-one":
								if (MyGroupObj[k].selectedIndex!=0) {
									MyGroupValue=0;	
								}
								break;
							case "select-multiple":
								if (MyGroupObj[k].selectedIndex!=-1) {
									MyGroupValue=0;	
								}
								break;
							case "hidden":
								NewString=MyGroupObj[k].value.replace(pattern,"");
								if (NewString.length!=0) {
									MyGroupValue=0;	
								}
								else {
									MyGroupObj[k].value="";
								}
								break;
						}
					}
		
				}
				if (MyGroupValue==1) {
					MyValue=1;
					j=MyObjArray.length+1;
				}
			}
			if (MyValue==0) {
				MyFocus.focus();
				alert (MyName);
				return false;
			}
			break;
		case "L": //Length
			MyObj=MM_findObj(MyObjString);
			MyRange=MyParam.split(":");
			MyName=MyNameString;
			var pattern =new RegExp("%u","g");
			var pattern1 =new RegExp("%","g");
			var MyURLString=new String(escape(MyObj.value));
			var TempString=new String(MyURLString.replace(pattern,""));
			var NewString=new String(TempString.replace(pattern1,""));
			var MyStringLength=new Number(MyURLString.length-(MyURLString.length-NewString.length)*2);
			if ((!(isNaN(MyRange[0]))) && (MyRange[0]!="") && (!(isNaN(MyRange[1]))) && (MyRange[1]!="")) {
				if (parseInt(MyRange[0])==parseInt(MyRange[1])) {
					if (MyStringLength!=parseInt(MyRange[0])) {
						MyObj.focus();
						alert ("Please input " + MyRange[0] + " characters in \""+ MyName + "\".");
						return false;
					}		
				}
				else {
				if ((!(isNaN(MyRange[0]))) && (MyRange[0]!="")) {
					if (MyStringLength<parseInt(MyRange[0])) {
							MyObj.focus();
							alert ("\""+ MyName + "\" is too short a word. Please input more than " + MyRange[0] + " characters.");
							return false;
						}
					}
					if ((!(isNaN(MyRange[1]))) && (MyRange[1]!="")) {
						if (MyStringLength>parseInt(MyRange[1])) {
							MyObj.focus();
							alert ("\""+ MyName + "\" is too long a word. Please input less than " + MyRange[1] + " characters.");
							return false;
						}
					}			
				}
			}
			else {
				if ((!(isNaN(MyRange[0]))) && (MyRange[0]!="")) {
					if (MyStringLength<parseInt(MyRange[0])) {
						MyObj.focus();
						alert ("\""+ MyName + "\" is too short a word. Please do not input less than " + MyRange[0] + " characters.");
						return false;
					}
				}
				if ((!(isNaN(MyRange[1]))) && (MyRange[1]!="")) {
					if (MyStringLength>parseInt(MyRange[1])) {
						MyObj.focus();
						alert ("\""+ MyName + "\" is too long a word. Please do not input more than " + MyRange[1] + " characters.");
						return false;
					}
				}			
			}
			
			break;
		
		case "P": //Password
			MyObjArray=MyObjString.split("|");
			var MyObj1=new Object(MM_findObj(MyObjArray[0]));
			var MyObj2=new Object(MM_findObj(MyObjArray[1]));
			var MyObj3=new Object(MM_findObj(MyObjArray[2]));
			MyName=MyNameString;
			switch (MyParam) {
				case  "noNull":
					if (!((MyObj1.value.length==0 && MyObj2.value.length==0 && MyObj3.value.length==0) || (MyObj1.value.length>0 && MyObj2.value.length>0 && MyObj3.value.length>0))) {
						alert ("To change password, please type old " + MyName + ", new " + MyName + " and confirm new " + MyName + ".");
						MyObj1.focus();
						return false;
					}
					else {
 						if (MyObj2.value!=MyObj3.value) {
 							alert ("The new " + MyName + "s you typed do not match!");
     							MyObj2.focus();
							return false;
						}
					}
				break;
				case  "Null":
					if (MyObj2.value!=MyObj3.value) {
 						alert ("The new " + MyName + "s you typed do not match!");
     						MyObj2.focus();
						return false;
					}
					break;
			}
			break;
		case "R": //Range
			MyObj=MM_findObj(MyObjString);
			MyRange=MyParam.split(":");
			MyName=MyNameString;
			if ((!(isNaN(MyRange[0]))) && (MyRange[0]!="")) {
				if (!(isNaN(MyRange[1])) && (MyRange[1]!="")) {					
					if (parseFloat(MyRange[0])==parseFloat(MyRange[1])) {
						if (parseFloat(MyObj.value)!=parseFloat(MyRange[0])) {
							alert("\"" + MyName + "\" should be equal to " + MyRange[0] + "!");
        						MyObj.focus();
							return false;
						}
					}
					else {
						
						if ((parseFloat(MyObj.value)<parseFloat(MyRange[0])) || (parseFloat(MyObj.value)>parseFloat(MyRange[1]))) {
							alert("\"" + MyName + "\" should be between " + MyRange[0] + " and " + MyRange[1] + "!");
        						MyObj.focus();
							return false;
						}
					}
				}
				else {
					if (parseFloat(MyObj.value)<parseFloat(MyRange[0])) {
						alert("\"" + MyName + "\" should be greater than or equal to " + MyRange[0] + "!");
        					MyObj.focus();
						return false;
					}
				}
			}
			else {
				if (!(isNaN(MyRange[1])) && (MyRange[1]!="")) {
					if (parseFloat(MyObj.value)>parseFloat(MyRange[1])) {
						alert("\"" + MyName + "\" should be smaller than or equal to " + MyRange[1] + "!");
        					MyObj.focus();
						return false;
					}
				}
			}		
			break;
		case "S": //Select
			MyObj=MM_findObj(MyObjString);
			MyName=MyNameString;
 			if (MyParam!="") {
 				if (MyObj.options[MyObj.selectedIndex].value==MyParam) {
 				        alert("Please select \"" + MyName + "\"!");
     					MyObj.focus();
					return false;
				}
			}
			break;
		case "T": //Data Type 
			MyObj=MM_findObj(MyObjString);
			var MyType=new Array();
			MyType=MyParam.split("|");
			MyName=MyNameString;
			for (j=0; j<(MyType.length); j++) {
				switch (MyType[j]) {
	 				case "Email":
 						if (MyObj.value.length!=0) {
 							if (isEmail(MyObj,MyName)==0) {
	 							return false;
	 						}
	 					}
	 					break;
	 				case "AN":
						if (MyObj.value.length!=0) { 
							if (isAN(MyObj,MyName)==0) {
								return false;
							}
						}
						break;
					case "Date":
						if (MyObj.value.length!=0) { 
							if (isDate(MyObj,MyName)==0) {
								return false;
							}
						}
						break;
					case "DDMMYYYY":
						if (MyObj.value.length!=0) { 
							if (isDDMMYYYY(MyObj,MyName)==0) {
								return false;
							}
						}
						break;
					case "M":
		 				if (isM(MyObj,MyName)==0) {
		 					return false;
		 				}
		 				break;
		 			case "N":
		 				if (MyObj.value.length!=0) { 
		 					if (isN(MyObj,MyName)==0) {
		 						return false;
		 					}
		 				}
		 				break;
		 			case "I":
		 				if (MyObj.value.length!=0) { 
		 					if (isI(MyObj,MyName)==0) {
		 						return false;
		 					}
		 				}
		 				break;
		 			case "URL":
		 				if (MyObj.value.length!=0) { 
		 					if (isURL(MyObj,MyName)==0) {
		 						return false;
		 					}
		 				}
		 				break;
		 		}
			}
			break;
	}
return true;
}

function isEmail(MyString,MyName) { // Email ('Email')
    if (MyString.value.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1) {
        return 1;
    }
    else {
        alert("Please input a valid e-mail address in \"" + MyName + "\"!");
        MyString.focus();
        return 0;
    }
}

function isAN(MyString,MyName) { // Alphanumeric ('AN')
	var pattern =new RegExp("[\f\n\r\t\v]","g");
	var NewString = new String(MyString.value.replace(pattern,""));
    if (NewString.search(/[^ -~]/) == -1) {
        return 1;
    }
    else {    
        alert("Please input Alphanumeric character in \"" + MyName + "\"!");
        MyString.focus();
        return 0;
    }
}

function isDate(MyString,MyName) { // Date ('D')
 if (MyString.value.search(/^\d{2}\/\d{2}\/\d{4} \d{2}/) != -1)  {
	if (MyString.value.indexOf("-")!=-1){
		var MyDateString=new String(MyString.value.replace(/ /ig,"-"));
		MyDateString=MyDateString.replace(/-/ig,"/");
		var MyDate =new Array();
		MyDate =MyDateString.split("/");
	}
	else {
		var MyDateString=new String(MyString.value.replace(/ /ig,"/"));
		var MyDate =new Array();
		MyDate =MyDateString.split("/");
	}
	var chkDate=new Date(MyDate[2],MyDate[1]-1,MyDate[0],MyDate[3]);
	var RealFullDate=new String((chkDate.getDate())+"/"+(chkDate.getMonth()+1)+"/"+(chkDate.getFullYear())+"/"+(chkDate.getHours()));
	var MyFullDate=new String((Math.abs(MyDate[0]))+"/"+(Math.abs(MyDate[1]))+"/"+(Math.abs(MyDate[2]))+"/"+(Math.abs(MyDate[3])));
	if (RealFullDate.toString()==MyFullDate.toString()) {
        	return 1;
        }
        else {
       		alert("Please input a valid date in \"" + MyName + "\"!");
        	MyString.focus();
        	return 0;
        }
    }
    else {    
        alert("Please input a valid date in \"" + MyName + "\"!");
        MyString.focus();
        return 0;
    }
}

function isDDMMYYYY(MyString,MyName) { // Date ('DDMMYYYY')
 if (MyString.value.search(/^\d{2}\/\d{2}\/\d{4}/) != -1)  {
	var MyDate =new Array();
	MyDate =MyString.value.split("/");
	var chkDate=new Date(MyDate[2],MyDate[1]-1,MyDate[0]);
	var RealFullDate=new String((chkDate.getDate())+"/"+(chkDate.getMonth()+1)+"/"+(chkDate.getFullYear()));
	var MyFullDate=new String((Math.abs(MyDate[0]))+"/"+(Math.abs(MyDate[1]))+"/"+(Math.abs(MyDate[2])));
	if (RealFullDate.toString()==MyFullDate.toString()) {
        	return 1;
        }
        else {
       		alert("Please input a valid date in \"" + MyName + "\"!");
        	MyString.focus();
        	return 0;
        }
    }
    else {    
        alert("Please input a valid date in \"" + MyName + "\"!");
        MyString.focus();
        return 0;
    }
}

function isM(MyString,MyName) { // Mandatory ('M')
    var pattern =new RegExp("[ \f\n\r\t\v]","g");
    var NewString = new String(MyString.value.replace(pattern,""));
    if (NewString.length != 0) {
        return 1;
    }
    else {    
        MyString.value="";
        alert("\"" + MyName + "\" is required!");
        MyString.focus();
        return 0;
    }
}

function isN(MyString,MyName) { // Number ('N')
    if (!(isNaN(MyString.value))) {
        return 1;
    }
    else {    
        alert("Please input a number in \"" + MyName + "\"");
        MyString.focus();
        return 0;
    }
}

function isI(MyString,MyName) { // Integer ('I')
    if (!(isNaN(MyString.value))) {
    	if (parseInt(parseFloat(MyString.value)) == parseFloat(MyString.value) && MyString.value.search(/^\d*$/) != -1) {
       	 	return 1;
       	}
       	else {
       	 	alert("Please input an integer in \"" + MyName + "\"");
       	 	MyString.focus();
        	return 0;
       	}
    }
    else {    
        alert("Please input an integer in \"" + MyName + "\"");
        MyString.focus();
        return 0;
    }
}

function isURL(MyString,MyName) { // URL ('URL')
    if (MyString.value.search(/^[^a-zA-Z]+:\/\/\S+((\.|-)\S+)*\.\S+$/) != -1 || MyString.value.search(/^\S+((\.|-)\S+)*\.\S+$/) != -1)
        return 1;
    else
        alert("Please input a valid URL in \"" + MyName + "\"!");
        MyString.focus();
        return 0;
}