<!-- Begin -->

var maskDefine = Class.create();

maskDefine.prototype = {
	lt_zero_mask : /^[^\-]*$/,
	sixnum_mask : /^[0-9]{6}$/,
	prodcode_mask : /^[a-zA-Z_0-9\-]*$/,
	phone1_mask : /^09[0-9]{8}$/,
	phone_mask : /^\(?(\d{3})\)?[-| ]?(\d{3})[-| ]?(\d{4})$/,
	telphone_mask : /(^[0-9]{2}-[0-9]{8}$)|(^[0-9]{3}-[0-9]{6}$)|(^[0-9]{2}-[0-9]{7}$)|(^[0-9]{9,10}$)|(^[0-9]{2}-[0-9]{8}#[0-9]{2,5}$)|(^[0-9]{3}-[0-9]{6}#[0-9]{2,5}$)|(^[0-9]{2}-[0-9]{7}#[0-9]{2,5}$)|(^[0-9]{9,10}#[0-9]{2,5}$)/,
	zipcode_mask : /^\d{5}\d*$/,
	date_pattern : "'yyyyMMdd'",
	chr_mask : /^[a-zA-Z0-9]{4,16}$/,
	invoiceNo_mask : /^[A-Z]{2}[0-9]{8}$/,
	chinese_pattern : /^[^\u2E80-\u9FFF]+$/,

	initialize: function() {
	}
}

var bCancel = false;

var pageValidate = Class.create();

pageValidate.prototype = { 	
	//Required,Integer,Mask,MaxLength,MinLength,IntRange,FloatRange,Email,CreditCard,Byte,Range,Date,Short,Float,Number

	chkArray : new Array("Required"),
	RequiredSets : null,
	IntegerSets : null,
	MaskSets : null,
	MinLengthSets : null,
	MaxLengthSets : null,
	IntRangeSets : null,
	FloatRangeSets : null,
	EmailSets : null,
    CompuidSets : null,
	CuidSets : null,
	CreditCardSets : null,
	ByteSets : null,
	RangeSets : null,
	DateSets : null,
	ShortSets : null,
	FloatSets : null,
	NumberSets : null,
	formName : "orderForm",
	errMsg : "",

	initialize: function(formName) {
		this.formName = formName;
		//this.form  = $(formName);
		//this.addFormElement(formName);
	},

	submitCheck : function(actionTo) {
		var form = this._getFormObj();
		//if(this.validateThisForm() === true){
		thisSubmit(form,actionTo,chkSet = this.validateThisForm());
			//form.submit();
		//}
	},

	validateThisForm : function() {
		var form = this._getFormObj();
		if (bCancel) {
			return true;
		}else{
			var formValidationResult = this.validate() + this.outSideValidateChk(form);
			if(formValidationResult.strip() == ""){
				return true;
			}else{
				alert(formValidationResult);
				return false;
			}
		}
	},

	outSideValidateChk : function(form){
		return "";
	},

	_getFormObj : function(){
		return eval("document." + this.formName);
	},

	validate : function(){
		form = this._getFormObj();
		chkArray = this.chkArray;
		var errMsg = "";
		if(chkArray.length<=0){
			errMsg = "chkArray didn't set";
			return errMsg;
		}
		
		for(i=0; i<chkArray.length; i++){
			var chkValue = chkArray[i];
			var execString = 'var fieldSets = this.' + chkValue + 'Sets;this.validate' + chkValue + '(form,fieldSets);';
			var outString = eval(execString) + "\n"
			if(outString != '\n'){
				errMsg += outString;
			}
			/*
			swicth (chkValue){
				case "FloatRange" :
					errMsg += eval("new validate" + chkValue + "(" + form + ")");
					break;
				case "Byte" :
					errMsg += eval("new validate" + chkValue + "(" + form + ")");
					break;
				case "MaxLength" :
					errMsg += eval("new validate" + chkValue + "(" + form + ")");
					break;
				case "Required" :
					errMsg += eval("new validate" + chkValue + "(" + form + ")");
					break;
				case "Integer" :
					errMsg += eval("new validate" + chkValue + "(" + form + ")");
					break;
				case "Range" :
					errMsg += eval("new validate" + chkValue + "(" + form + ")");
					break;
				case "CreditCard" :
					errMsg += eval("new validate" + chkValue + "(" + form + ")");
					break;
				case "Date" :
					errMsg += eval("new validate" + chkValue + "(" + form + ")");
					break;
				case "IntRange" :
					errMsg += eval("new validate" + chkValue + "(" + form + ")");
					break;
				case "Short" :
					errMsg += eval("new validate" + chkValue + "(" + form + ")");
					break;
				case "Float" :
					errMsg += eval("new validate" + chkValue + "(" + form + ")");
					break;
				case "Email" :
					errMsg += eval("new validate" + chkValue + "(" + form + ")");
					break;
				case "MinLength" :
					errMsg += eval("new validate" + chkValue + "(" + form + ")");
					break;
				case "Mask" :
					errMsg += eval("new validate" + chkValue + "(" + form + ")");
					break;
				case "Number" :
					errMsg += eval("new validate" + chkValue + "(" + form + ")");
					break;
				default:
					break;	
			}
			*/
		}
		return errMsg;
	},

	validateFloatRangeItem : function(field,fieldMsg,minFloat,maxFloat){

				var errMsg = "";
				if ((field.type == 'text' ||
					 field.type == 'textarea') &&
					(field.value.length > 0)) {
					
					var fMin = parseFloat(minFloat);
					var fMax = parseFloat(maxFloat);
					var fValue = parseFloat(field.value);
					if (!(fValue >= fMin && fValue <= fMax)) {
						errMsg = fieldMsg;
					}
				}

				return errMsg;
	},

	validateFloatRange : function(form, fieldSets) {
				var bValid = true;
				var focusField = null;
				var fields = new Array();
				var i = 0;
				oRange = fieldSets;
				var msg = "";
				for (x in oRange) {
					var field = form[oRange[x][0]];
					var fieldMsg = oRange[x][1];
					var minFloat = oRange[x][2]("min");
					var maxFloat = oRange[x][2]("max");
					
					var errMsg = this.validateFloatRangeItem(field,fieldMsg,minFloat,maxFloat);
					if (errMsg != "") {
						if (i == 0) {
								focusField = field;
						}
						fields[i++] = errMsg;
						isValid = false;
					}
				}
				
				if (fields.length > 0) {
					focusField.focus();
					msg = fields.join('\n');
				}
				
				var rtValue =  msg;
				
				return rtValue;
	},

	validateByteItem : function(field,fieldMsg){

				var errMsg = "";
				if (field.type == 'text' ||
					field.type == 'textarea' ||
					field.type == 'select-one' ||
					field.type == 'radio') {

					var value = '';
					// get field's value
					if (field.type == "select-one") {
						var si = field.selectedIndex;
						if (si >= 0) {
							value = field.options[si].value;
						}
					} else {
						value = field.value;
					}
					
					if (value.length > 0) {
						if (!this.isAllDigits(value)) {
							errMsg = fieldMsg;

						} else {

							var iValue = parseInt(value);
							if (isNaN(iValue) || !(iValue >= -128 && iValue <= 127)) {
								errMsg = fieldMsg;
							}
						}
					}
					
				}
				
				return errMsg;
	},          
			
	validateByte : function(form, fieldSets) {
				var bValid = true;
				var focusField = null;
				var i = 0;
				var fields = new Array();
				oByte = fieldSets;
				var msg = "";
				for (x in oByte) {
					var field = form[oByte[x][0]];
					var fieldMsg = oByte[x][1];
					
					var errMsg = this.validateByteItem(field,fieldMsg);
					if (errMsg != "") {
						if (i == 0) {
							focusField = field;
						}
						fields[i++] = errMsg;
						isValid = false;
					}                	
				}                
				
				if (fields.length > 0) {
				   focusField.focus();
					msg = fields.join('\n');
				}
				
				var rtValue = msg;
				
				return rtValue;
	},
			
	validateMaxLengthItem : function(field,fieldMsg,maxLength){
				var errMsg = "";
				if (field.type == 'text' ||
					field.type == 'textarea') {
					
					var iMax = parseInt(maxLength);
					if (field.value.length > iMax) {
						errMsg = fieldMsg;
					}
				}
				return errMsg;
	},
		
	validateMaxLength : function(form, fieldSets) {
				var isValid = true;
				var focusField = null;
				var i = 0;
				var fields = new Array();
				oMaxLength = fieldSets;
				var msg = "";
				for (x in oMaxLength) {
					var field = form[oMaxLength[x][0]];
					var fieldMsg = oMaxLength[x][1];
					var maxLength = oMaxLength[x][2]("maxlength");
					
					var errMsg = this.validateMaxLengthItem(field,fieldMsg,maxLength);
					if (errMsg != "") {
						if (i == 0) {
							focusField = field;
						}
						fields[i++] = errMsg;
						isValid = false;
					}    
				}
				
				if (fields.length > 0) {
				   focusField.focus();
				   msg = fields.join('\n');
				}
				
				var rtValue = msg;
				
				return rtValue;
	},

	validateRequiredItem  : function(field,fieldMsg) {
				var errMsg = "";
				if (field.type == 'text' ||
						field.type == 'textarea' ||
						field.type == 'file' ||
						field.type == 'select-one' ||
						field.type == 'radio' ||
						field.type == 'checkbox' ||
						field.type == 'password') {
						
						var value = '';
						// get field's value
						if (field.type == "select-one") {
							var si = field.selectedIndex;
							if (si >= 0) {
								value = field.options[si].value;
							}
						}else if (field.type == 'checkbox' || field.type == 'radio') {
							if (field.checked == true) {
								value = "checked";
							}else{
								value = '';
							}
						} else {
							value = field.value;
						}
						
						if (this.trim(value).length == 0) {
							errMsg = fieldMsg;
						}
				} else if (field.type == "select-multiple") {
						 var numOptions = field.options.length;
						 lastSelected=-1;
						 for(loop=numOptions-1;loop>=0;loop--) {
							 if(field.options[loop].selected) {
								 lastSelected = loop;
								 value = field.options[loop].value;
								 break;
							 }
						 }
						 if(lastSelected < 0 || this.trim(value).length == 0){
							errMsg = fieldMsg;
						 }    
				} else if ((field.length > 0) && 
						   (field[0].type == 'radio' || 
							field[0].type == 'checkbox')) {
						var value = '';
						 isChecked=-1;
						 for (loop=0;loop < field.length;loop++) {
							 if (field[loop].checked) {
								 isChecked=loop;
								 break; // only one needs to be checked
							 }
						 }
						 if (isChecked < 0) {
							 errMsg = fieldMsg;
						 }   
			   }
			 return errMsg;
	},           
			
	validateRequired  : function(form, fieldSets) {
				var bValid = true;
				var focusField = null;
				var i = 0;
				var fields = new Array();
				var oRequired = fieldSets;
				var msg = "";
				for (x in oRequired) {
					var field = form[oRequired[x][0]];
					var fieldMsg = oRequired[x][1];
					var errMsg = "";
					
					if(field.length > 0){
						if((field[0].type == 'checkbox' || field[0].type == 'radio' || field.type == 'select-one')){
							errMsg = this.validateRequiredItem(field,fieldMsg);
						}else{
							for(loop=0; loop<field.length; loop++){
								errMsg = this.validateRequiredItem(field[loop],fieldMsg);
								if(errMsg != ""){
									break;
								}
							}
						}
					}else{
						errMsg = this.validateRequiredItem(field,fieldMsg);
					}
					
					if (errMsg != "") {
						if (i == 0) {
							focusField = field;
						}
						fields[i++] = errMsg;
						bValid = false;
					}                    	
				}
				
				if (fields.length > 0) {
					if(focusField[0] == null) focusField.focus();
					msg = fields.join('\n');
				}
				
				var rtValue = msg;
				
				return rtValue;
	},
			
	// Trim whitespace from left and right sides of s.
	trim  : function(s) {
		return s.replace( /^\s*/, "" ).replace( /\s*$/, "" );
	},

	validateIntegerItem  : function(field,fieldMsg){
				var errMsg = "";
				
				if (field.type == 'text' ||
						field.type == 'textarea' ||
						field.type == 'select-one' ||
						field.type == 'radio') {
						
						var value = '';
						// get field's value
						if (field.type == "select-one") {
							var si = field.selectedIndex;
							if (si >= 0) {
								value = field.options[si].value;
							}
						} else {
							value = field.value;
						}
						
						if (value.length > 0) {
						
							if (!this.isAllDigits(value)) {
								errMsg = fieldMsg;
							}else {
								var iValue = parseInt(value);
								if (isNaN(iValue) || !(iValue >= -2147483648 && iValue <= 2147483647)) {
									errMsg = fieldMsg;
							   }
						   }
					   }
				}
				//
				return errMsg;
	},
			
	validateInteger : function(form, fieldSets) {
				var bValid = true;
				var focusField = null;
				var i = 0;
				var fields = new Array();
				oInteger = fieldSets;
				var msg = "";
				for (x in oInteger) {
					var field = form[oInteger[x][0]];
					var fieldMsg = oInteger[x][1];
					var errMsg = "";
					
					if(field.length > 0){
						for(loop=0; loop<field.length; loop++){
							errMsg = this.validateIntegerItem(field[loop],fieldMsg);
							if(errMsg != ""){
								break;
							}
						}
					}else{
						errMsg = this.validateIntegerItem(field,fieldMsg);
					}
					
					if (errMsg != "") {
						if (i == 0) {
							focusField = field;
						}
						fields[i++] = errMsg;
						bValid = false;
					}        
				}
				
				if (fields.length > 0) {
				   if(focusField[0] == null) focusField.focus();
					msg = fields.join('\n');
				}
				
				var rtValue = msg;
				
				return rtValue;
	},

	isAllDigits  : function(argvalue) {
		argvalue = argvalue.toString();
		var validChars = "0123456789";
		var startFrom = 0;
		if (argvalue.substring(0, 2) == "0x") {
		   validChars = "0123456789abcdefABCDEF";
		   startFrom = 2;
		} else if (argvalue.charAt(0) == "0") {
		   validChars = "01234567";
		   startFrom = 1;
		} else if (argvalue.charAt(0) == "-") {
			startFrom = 1;
		}
		
		for (var n = startFrom; n < argvalue.length; n++) {
			if (validChars.indexOf(argvalue.substring(n, n+1)) == -1) return false;
		}
		return true;
	},

	validateRange  : function(form, fieldSets) {
				return this.validateIntRange(form);
	},
	
	validateCompuidItem : function(field,fieldMsg){
				var errMsg = "";
				if (field.type == 'text' &&
					(field.value.length > 0)) {
					if (this.checkCompuid(field.value) != "") {
						errMsg = fieldMsg;
					}
				}
				return errMsg;	
	},

    checkCompuid : function(comNo){
        var msg = "";
        //comNo=thisObj.value;
        var res = new Array(8);
        var key = "12121241";
        var isModeTwo = false;    //第七個數是否為七
        var result = 0;

        for(var i=0; i<8; i++)
        {
            var tmp = comNo.charAt(i) * key.charAt(i);
            res[i] = Math.floor(tmp/10) + (tmp%10); //取出十位數和個位數相加
            if(i == 6 && comNo.charAt(i) == 7)
                isModeTwo = true;
        }
        for(var s=0; s<8; s++)
            result += res[s];

        if(isModeTwo){
            if((result % 10) != 0 && ((result + 1) % 10) != 0){//如果第七位數為7
                msg += '【統一編號】編碼不正確，請重新輸入！\n';
                return msg;
            }
        }
        else
            if((result % 10) != 0){
                msg += '【統一編號】編碼不正確，請重新輸入！\n';
                return msg;
            }
        return msg;   
    },               
            
    validateCompuid : function(form, fieldSets) {
                var bValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oCreditCard = fieldSets;
                var msg = "";
                for (x in oCreditCard) {
                    var field = form[oCreditCard[x][0]];
                    var fieldMsg = oCreditCard[x][1];
                    
                    var errMsg = this.validateCompuidItem(field,fieldMsg);
                    if (errMsg != "") {
                        if (i == 0) {
                            focusField = field;
                        }
                        fields[i++] = errMsg;
                        bValid = false;
                    }       
                }
                if (fields.length > 0) {
                    if(focusField[0] == null) focusField.focus();
                    msg = fields.join('\n');
                }
                
                var rtValue = msg;
                
                return rtValue;
    },
    
    validateCuidItem : function(field,fieldMsg){
                var errMsg = "";
                if (field.type == 'text' &&
                    (field.value.length > 0)) {
                    if (this.checkCuid(field.value) != "") {
                        errMsg = fieldMsg;
                    }
                }
                return errMsg;    
    },
            
	checkCuid  : function(id){
		var msg = "";
		var first,val,str,str1,i,v1,v2,total;
		if (id.length != 10 || (id.substr(1,1)!="1" && id.substr(1,1)!="2")) {
			msg += "您填寫的身份證字號不正確！長度不正確或第二碼有誤\n";
			return msg;
		}
		str="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		val="1011121314151617341819202122352324252627282932303133";
		first=str.indexOf(id.substr(0,1));//不區分大小寫--.toUpperCase());
		if (first==-1) {
			msg += "您填寫的身份證字號不正確！首字要大寫\n";
			return msg;
		}
		for (i=2; i < 9; i++) {
		if (id.substr(i,1) >= "0" && id.substr(i,1) <= "9") continue;
			msg += "您填寫的身份證字號不正確！二到九碼必須是數字\n";
			return msg;
		}
		str1=val.substr(first*2,2);
		v1=parseInt(str1.substr(0,1));
		v2=parseInt(str1)%10;
		total=v1+v2*9+parseInt(id.substr(1,1))*8+parseInt(id.substr(2,1))*7+parseInt(id.substr(3,1))*6;
		total=total+parseInt(id.substr(4,1))*5+parseInt(id.substr(5,1))*4+parseInt(id.substr(6,1))*3;
		total=total+parseInt(id.substr(7,1))*2+parseInt(id.substr(8,1))+parseInt(id.substr(9,1));
		if ((total%10)==0) {
			return "";
		}else{
			msg += "您填寫的身份證不正確！不符合檢核規則\n";
			return msg;
		}
	},            
            
            
    validateCuid : function(form, fieldSets) {
                var bValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oCreditCard = fieldSets;
                var msg = "";
                for (x in oCreditCard) {
                    var field = form[oCreditCard[x][0]];
                    var fieldMsg = oCreditCard[x][1];
                    
                    var errMsg = this.validateCuidItem(field,fieldMsg);
                    if (errMsg != "") {
                        if (i == 0) {
                            focusField = field;
                        }
                        fields[i++] = errMsg;
                        bValid = false;
                    }       
                }
                if (fields.length > 0) {
                    if(focusField[0] == null) focusField.focus();
                    msg = fields.join('\n');
                }
                
                var rtValue = msg;
                
                return rtValue;
    },
	
	validateCreditCardItem  : function(field,fieldMsg){
				var errMsg = "";
				if ((field.type == 'text' ||
					 field.type == 'textarea') &&
					(field.value.length > 0)) {
					if (!this.luhnCheck(field.value)) {
						errMsg = fieldMsg;
					}
				}
				return errMsg;
	},            
			
			
	validateCreditCard : function(form, fieldSets) {
				var bValid = true;
				var focusField = null;
				var i = 0;
				var fields = new Array();
				oCreditCard = fieldSets;
				var msg = "";
				for (x in oCreditCard) {
					var field = form[oCreditCard[x][0]];
					var fieldMsg = oCreditCard[x][1];
					
					var errMsg = this.validateCreditCardItem(field,fieldMsg);
					if (errMsg != "") {
						if (i == 0) {
							focusField = field;
						}
						fields[i++] = errMsg;
						bValid = false;
					}       
				}
				if (fields.length > 0) {
					if(focusField[0] == null) focusField.focus();
					msg = fields.join('\n');
				}
				
				var rtValue = msg;
				
				return rtValue;
	},

	/**
	 * Reference: http://www.ling.nwu.edu/~sburke/pub/luhn_lib.pl
	 */
	luhnCheck : function(cardNumber) {
		if (this.isLuhnNum(cardNumber)) {
			var no_digit = cardNumber.length;
			var oddoeven = no_digit & 1;
			var sum = 0;
			for (var count = 0; count < no_digit; count++) {
				var digit = parseInt(cardNumber.charAt(count));
				if (!((count & 1) ^ oddoeven)) {
					digit *= 2;
					if (digit > 9) digit -= 9;
				};
				sum += digit;
			};
			if (sum == 0) return false;
			if (sum % 10 == 0) return true;
		};
		return false;
	},

	isLuhnNum : function(argvalue) {
		argvalue = argvalue.toString();
		if (argvalue.length == 0) {
			return false;
		}
		for (var n = 0; n < argvalue.length; n++) {
			if ((argvalue.substring(n, n+1) < "0") ||
				(argvalue.substring(n,n+1) > "9")) {
				return false;
			}
		}
		return true;
	},

	validateDateItem : function(field,fieldMsg,datePattern){
				var errMsg = "";
				var value = field.value;
				
				   if ((field.type == 'text' ||
						field.type == 'textarea') &&
					   (value.length > 0) &&
					   (datePattern.length > 0)) {
					 var MONTH = "MM";
					 var DAY = "dd";
					 var YEAR = "yyyy";
					 var orderMonth = datePattern.indexOf(MONTH);
					 var orderDay = datePattern.indexOf(DAY);
					 var orderYear = datePattern.indexOf(YEAR);
					 if ((orderDay < orderYear && orderDay > orderMonth)) {
						 var iDelim1 = orderMonth + MONTH.length;
						 var iDelim2 = orderDay + DAY.length;
						 var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
						 var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
						 if (iDelim1 == orderDay && iDelim2 == orderYear) {
							dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
						 } else if (iDelim1 == orderDay) {
							dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
						 } else if (iDelim2 == orderYear) {
							dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
						 } else {
							dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
						 }
						 var matched = dateRegexp.exec(value);
						 if(matched != null) {
							if (!isValidDate(matched[2], matched[1], matched[3])) {
							   errMsg = fieldMsg;
							}
						 } else {
							errMsg = fieldMsg;
						 }
					 } else if ((orderMonth < orderYear && orderMonth > orderDay)) {
						 var iDelim1 = orderDay + DAY.length;
						 var iDelim2 = orderMonth + MONTH.length;
						 var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
						 var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
						 if (iDelim1 == orderMonth && iDelim2 == orderYear) {
							 dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
						 } else if (iDelim1 == orderMonth) {
							 dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
						 } else if (iDelim2 == orderYear) {
							 dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
						 } else {
							 dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
						 }
						 var matched = dateRegexp.exec(value);
						 if(matched != null) {
							 if (!isValidDate(matched[1], matched[2], matched[3])) {
								 errMsg = fieldMsg;
							  }
						 } else {
							 errMsg = fieldMsg;
						 }
					 } else if ((orderMonth > orderYear && orderMonth < orderDay)) {
						 var iDelim1 = orderYear + YEAR.length;
						 var iDelim2 = orderMonth + MONTH.length;
						 var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
						 var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
						 if (iDelim1 == orderMonth && iDelim2 == orderDay) {
							 dateRegexp = new RegExp("^(\\d{4})(\\d{2})(\\d{2})$");
						 } else if (iDelim1 == orderMonth) {
							 dateRegexp = new RegExp("^(\\d{4})(\\d{2})[" + delim2 + "](\\d{2})$");
						 } else if (iDelim2 == orderDay) {
							 dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})(\\d{2})$");
						 } else {
							 dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{2})$");
						 }
						 var matched = dateRegexp.exec(value);
						 if(matched != null) {
							 if (!this.isValidDate(matched[3], matched[2], matched[1])) {
								 errMsg = fieldMsg;
							  }
						  } else {
							  errMsg = fieldMsg;
						  }
					 } else {
						 errMsg = fieldMsg;
					 }
				  }
				return errMsg;
	},           
			
	validateDate : function(form, fieldSets) {
			   var bValid = true;
			   var focusField = null;
			   var i = 0;
			   var fields = new Array();
			   oDate = fieldSets;
				var msg = "";
			   for (x in oDate) {
					var field = form[oDate[x][0]];
					var fieldMsg = oDate[x][1];
					var datePattern = oDate[x][2]("datePatternStrict");
					
					var errMsg = this.validateDateItem(field,fieldMsg,datePattern);
					if (errMsg != "") {
						if (i == 0) {
								focusField = field;
						}
							fields[i++] = errMsg;
							bValid = false;
					}   
			   }
			   if (fields.length > 0) {
				  if(focusField[0] == null) focusField.focus();
					msg = fields.join('\n');
				}
				
				var rtValue = msg;
				
				return rtValue;
	},

	isValidDate : function(day, month, year) {
			if (month < 1 || month > 12) {
					return false;
				}
				if (day < 1 || day > 31) {
					return false;
				}
				if ((month == 4 || month == 6 || month == 9 || month == 11) &&
					(day == 31)) {
					return false;
				}
				if (month == 2) {
					var leap = (year % 4 == 0 &&
							   (year % 100 != 0 || year % 400 == 0));
					if (day>29 || (day == 29 && !leap)) {
						return false;
					}
				}
				return true;
	},

	validateIntRangeItem : function(field,fieldMsg,minInt,maxInt){
				var errMsg = "";
				if ((field.type == 'text' ||
					 field.type == 'textarea') &&
					(field.value.length > 0)) {
					
					var iMin = parseInt(minInt);
					var iMax = parseInt(maxInt);
					var iValue = parseInt(field.value);
					if (!(iValue >= iMin && iValue <= iMax)) {
						errMsg = fieldMsg;
					}
				}
				return errMsg;
	},           
			
	validateIntRange : function(form, fieldSets) {
				var bValid = true;
				var focusField = null;
				var i = 0;
				var fields = new Array();
				oRange = fieldSets;
				var msg = "";
				for (x in oRange) {
					var field = form[oRange[x][0]];
					var fieldMsg = oRange[x][1];
					var minInt = oRange[x][2]("min");
					var maxInt = oRange[x][2]("max");
					
					var errMsg = this.validateIntRangeItem(field,fieldMsg,minInt,maxInt);
					if (errMsg != "") {
						if (i == 0) {
							focusField = field;
						}
						fields[i++] = errMsg;
						bValid = false;
					}   
				}
				if (fields.length > 0) {
					if(focusField[0] == null) focusField.focus();
					msg = fields.join('\n');
				}
				
				var rtValue = msg;
				
				return rtValue;
	},

	validateShort : function(field,fieldMsg){
				var errMsg;
				if (field.type == 'text' ||
				field.type == 'textarea' ||
				field.type == 'select-one' ||
				field.type == 'radio') {
					var value = '';
					// get field's value
					if (field.type == "select-one") {
						var si = field.selectedIndex;
						if (si >= 0) {
							value = field.options[si].value;
						}
					} else {
						value = field.value;
					}
					
					if (value.length > 0) {
						if (!this.isAllDigits(value)) {
							errMsg = fieldMsg;
	
						} else {
					
							var iValue = parseInt(value);
							if (isNaN(iValue) || !(iValue >= -32768 && iValue <= 32767)) {
								errMsg = fieldMsg;
							}
					   }
				   }
				}				
				return errMsg;
	},          
			
	validateShort : function(form, fieldSets) {
				var bValid = true;
				var focusField = null;
				var i = 0;
				var fields = new Array();
				oShort = fieldSets;
				var msg = "";
				for (x in oShort) {
					var field = form[oShort[x][0]];
					var fieldMsg = oShort[x][1];
					
					var errMsg = this.validateShortItem(field,fieldMsg);
					if (errMsg != "") {
						if (i == 0) {
							focusField = field;
						}
						fields[i++] = errMsg;
						bValid = false;
					}   
					
				}
				if (fields.length > 0) {
				   if(focusField[0] == null) focusField.focus();
				   msg = fields.join('\n');
				}
				
				var rtValue = msg;
				
				return rtValue;
	},
			
	validateFloatItem : function(field,fieldMsg){
				var errMsg = "";
				if (field.type == 'text' ||
						field.type == 'textarea' ||
						field.type == 'select-one' ||
						field.type == 'radio') {
						
						var value = '';
						// get field's value
						if (field.type == "select-one") {
							var si = field.selectedIndex;
							if (si >= 0) {
								value = field.options[si].value;
							}
						} else {
							value = field.value;
						}
						
						if (value.length > 0) {
							// remove '.' before checking digits
							var tempArray = value.split('.');
							var joinedString= tempArray.join('');

							if (!this.isAllDigits(joinedString)) {
								errMsg = fieldMsg;
							} else {
								var iValue = parseFloat(value);
								if (isNaN(iValue)) {
									errMsg = fieldMsg;
								}
							}
						}
					}
				return errMsg;
	},            
			
	validateFloat : function(form, fieldSets) {
				var bValid = true;
				var focusField = null;
				var i = 0;
				var fields = new Array();
				oFloat = fieldSets;
				var msg = "";
				for (x in oFloat) {
					var field = form[oFloat[x][0]];
					var fieldMsg = oFloat[x][1];
					
					var errMsg = this.validateFloatItem(field,fieldMsg);
					if (errMsg != "") {
						if (i == 0) {
							focusField = field;
						}
						fields[i++] = errMsg;
						bValid = false;
					}                   	
				}
				if (fields.length > 0) {
				   if(focusField[0] == null) focusField.focus();
				   msg = fields.join('\n');
				}
				
				var rtValue = msg;
				
				return rtValue;
	},
			
	validateEmailItem : function(field,fieldMsg){
				var errMsg = "";
				if ((field.type == 'text' ||
					 field.type == 'textarea') &&
					(field.value.length > 0)) {
					if (!this.checkEmail(field.value)) {
						errMsg = fieldMsg;
					}
				}
				return errMsg;
	},         
			
	validateEmail : function(form, fieldSets) {
				var bValid = true;
				var focusField = null;
				var i = 0;
				var fields = new Array();
				oEmail = fieldSets;
				var msg = "";
				for (x in oEmail) {
					var field = form[oEmail[x][0]];
					var fieldMsg = oEmail[x][1];
					
					var errMsg = this.validateEmailItem(field,fieldMsg);
					if (errMsg != "") {
						if (i == 0) {
							focusField = field;
						}
						fields[i++] = errMsg;
						bValid = false;
					}                     	
				}
				if (fields.length > 0) {
					if(focusField[0] == null) focusField.focus();
					msg = fields.join('\n');
				}
				
				var rtValue = msg;
				
				return rtValue;
	},

	/**
	 * Reference: Sandeep V. Tamhankar (stamhankar@hotmail.com),
	 * http://javascript.internet.com
	 */
	checkEmail : function(emailStr) {
	   if (emailStr.length == 0) {
		   return true;
	   }
	   var emailPat=/^(.+)@(.+)$/;
	   var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
	   var validChars="\[^\\s" + specialChars + "\]";
	   var quotedUser="(\"[^\"]*\")";
	   var ipDomainPat=/^(\d{1,3})[.](\d{1,3})[.](\d{1,3})[.](\d{1,3})$/;
	   var atom=validChars + '+';
	   var word="(" + atom + "|" + quotedUser + ")";
	   var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
	   var domainPat=new RegExp("^" + atom + "(\\." + atom + ")*$");
	   var matchArray=emailStr.match(emailPat);
	   if (matchArray == null) {
		   return false;
	   }
	   var user=matchArray[1];
	   var domain=matchArray[2];
	   if (user.match(userPat) == null) {
		   return false;
	   }
	   var IPArray = domain.match(ipDomainPat);
	   if (IPArray != null) {
		   for (var i = 1; i <= 4; i++) {
			  if (IPArray[i] > 255) {
				 return false;
			  }
		   }
		   return true;
	   }
	   var domainArray=domain.match(domainPat);
	   if (domainArray == null) {
		   return false;
	   }
	   var atomPat=new RegExp(atom,"g");
	   var domArr=domain.match(atomPat);
	   var len=domArr.length;
	   if ((domArr[domArr.length-1].length < 2) ||
		   (domArr[domArr.length-1].length > 3)) {
		   return false;
	   }
	   if (len < 2) {
		   return false;
	   }
	   return true;
	},
			
	validateMaskItem : function(field,fieldMsg,maskPattern){
				var errMsg = "";
				if ((field.type == 'text' || 
					 field.type == 'textarea' || field.type == 'file') && 
					 (field.value.length > 0)) {
					
					if (!this.matchPattern(field.value, maskPattern)) {
						errMsg = fieldMsg;
					}
				}				
				return errMsg;
	},         
			
	validateMask : function(form, fieldSets) {
				var bValid = true;
				var focusField = null;
				var i = 0;
				var fields = new Array();
				oMasked = fieldSets;
				var msg = "";
				var errMsg = "";
				for (x in oMasked) {
					var field = form[oMasked[x][0]];
					var fieldMsg = oMasked[x][1];
					var maskPattern = oMasked[x][2]("mask");

					if(field.length > 0){
						for(loop=0; loop<field.length; loop++){
							errMsg = this.validateMaskItem(field[loop],fieldMsg,maskPattern);
							if(errMsg != ""){
								break;
							}
						}
					}else{
						errMsg = this.validateMaskItem(field,fieldMsg,maskPattern);
					}                    
					
					if (errMsg != "") {
						if (i == 0) {
							focusField = field;
						}
						fields[i++] = errMsg;
						bValid = false;
					}                      
				}
				
				if (fields.length > 0) {
				   if(focusField[0] == null) focusField.focus();
				   msg = fields.join('\n');
				}
				
				var rtValue = msg;
				
				return rtValue;
	},

	matchPattern : function(value, mask) {
	   return mask.exec(value);
	},

	validateMinLength : function(field,fieldMsg,minLength){
				var errMsg = "";
				if (field.type == 'text' ||
					field.type == 'textarea') {
					
					var iMin = parseInt(minLength);
					if ((this.trim(field.value).length > 0) && (field.value.length < iMin)) {
						errMsg = fieldMsg;
					}
				}				
				return errMsg;
	},           
			
	validateMinLength : function(form, fieldSets) {
				var bValid = true;
				var focusField = null;
				var i = 0;
				var fields = new Array();
				var msg = "";
				oMinLength = fieldSets;
				for (x in oMinLength) {
					var field = form[oMinLength[x][0]];
					var fieldMsg = oMinLength[x][1];
					var minLength = oMinLength[x][2]("minlength");
					
					var errMsg = this.validateMinLengthItem(field,fieldMsg,minLength);
					if (errMsg != "") {
						if (i == 0) {
							focusField = field;
						}
						fields[i++] = errMsg;
						bValid = false;
					}                           
				}
				if (fields.length > 0) {
				   if(focusField[0] == null) focusField.focus();
				   msg = fields.join('\n');
				}
				
				var rtValue = msg;
				
				return rtValue;
	},  

	validateMoneyOverZeroItem : function(field,fieldMsg){
				var errMsg = "";
				if (field.type == 'text' ||
						field.type == 'textarea' ||
						field.type == 'select-one' ||
						field.type == 'radio') {
						
						var value = '';
						// get field's value
						if (field.type == "select-one") {
							var si = field.selectedIndex;
							if (si >= 0) {
								value = field.options[si].value;
							}
						} else {
							value = field.value;
						}
						
						if (isNaN(value)) {
							errMsg = fieldMsg;
						}else{
							if(parseInt(value)<=0){
								errMsg = fieldMsg;
							}
						}
					}				
				return errMsg;
	}, 
						
			
	validateMoneyOverZero : function(form, fieldSets){
				var bValid = true;
				var focusField = null;
				var i = 0;
				var fields = new Array();
				var msg = "";
				oNumber = fieldSets;
				var errMsg = "";
				for (x in oNumber) {
					var field = form[oNumber[x][0]];
					var fieldMsg = oNumber[x][1];
					
					if(field.length > 0){
						if((field[0].type == 'checkbox' || field[0].type == 'radio')){
							errMsg = this.validateMoneyOverZeroItem(field,fieldMsg);
						}else{
							for(loop=0; loop<field.length; loop++){
								errMsg = this.validateMoneyOverZeroItem(field[loop],fieldMsg);
								if(errMsg != ""){
									break;
								}
							}
						}
					}else{
						errMsg = this.validateMoneyOverZeroItem(field,fieldMsg);
					}
										
					if (errMsg != "") {
						if (i == 0) {
							focusField = field;
						}
						fields[i++] = errMsg;
						bValid = false;
					}                           
				}
				if (fields.length > 0) {
				   if(focusField[0] == null) focusField.focus();
				   msg = fields.join('\n');
				}
				
				var rtValue = msg;
				
				return rtValue;
	},       

	validateFileTypeItem : function(field, fieldMsg, aryFileLimit) {
				var extArray = aryFileLimit;
				var errMsg = "";
				var strExtList = extArray.join("  ");
				var allowFlag = false;

				if (field.type == 'file') {
					var file = field.value;
					while (file.indexOf("\\") != -1) {
						file = file.slice(file.indexOf("\\") + 1);
					}
					var ext = file.slice(file.indexOf(".")).toLowerCase();
					for (var i = 0; i < extArray.length; i++) {
						if (extArray[i] == ext) { 
							allowFlag = true;
							break; 
						}
					}
					if (!allowFlag){
						errMsg += "請針對下列檔案類別上傳 :  " + strExtList + "\n請再次選擇正確的檔案格式.";
					}    
				}
				
				return errMsg;

	},

	validateFileType : function(form, fieldSets){
				var bValid = true;
				var focusField = null;
				var i = 0;
				var fields = new Array();
				oFileTypeed = fieldSets;
				var msg = "";
				var errMsg = "";
				for (x in oFileTypeed) {
					var field = form[oFileTypeed[x][0]];
					var fieldMsg = oFileTypeed[x][1];
					//ex:var extArray = new Array(".gif", ".jpg");
					var aryFileLimit = oFileTypeed[x][2]("fileLimitArray");

					if(field.length > 0){
						for(loop=0; loop<field.length; loop++){
							errMsg = this.validateFileTypeItem(field[loop],fieldMsg,aryFileLimit);
							if(errMsg != ""){
								break;
							}
						}
					}else{
						errMsg = this.validateFileTypeItem(field,fieldMsg,aryFileLimit);
					}                    
					
					if (errMsg != "") {
						if (i == 0) {
							focusField = field;
						}
						fields[i++] = errMsg;
						bValid = false;
					}                      
				}
				
				if (fields.length > 0) {
				   if(focusField[0] == null) focusField.focus();
				   msg = fields.join('\n');
				}
				
				var rtValue = msg;
				
				return rtValue;
	}
};

<!-- End --> 

<!-- 以下是檢查統一編號的程式 -->
    function checkCompanyNo(comNo){
        var msg = "";
        //comNo=thisObj.value;
        var res = new Array(8);
        var key = "12121241";
        var isModeTwo = false;	//第七個數是否為七
        var result = 0;

        for(var i=0; i<8; i++)
        {
	        var tmp = comNo.charAt(i) * key.charAt(i);
	        res[i] = Math.floor(tmp/10) + (tmp%10); //取出十位數和個位數相加
	        if(i == 6 && comNo.charAt(i) == 7)
		        isModeTwo = true;
        }
        for(var s=0; s<8; s++)
	        result += res[s];

        if(isModeTwo){
	        if((result % 10) != 0 && ((result + 1) % 10) != 0){//如果第七位數為7
		        msg += '【統一編號】編碼不正確，請重新輸入！\n';
		        return msg;
	        }
        }
        else
	        if((result % 10) != 0){
		        msg += '【統一編號】編碼不正確，請重新輸入！\n';
		        return msg;
	        }
        return msg;
    }
<!-- 以上是檢查統一編號的程式 -->
<!-- 以下是檢查身份證字號的程式 -->
function checkCid(id) {
	var msg = "";
	var first,val,str,str1,i,v1,v2,total;
	if (id.length != 10 || (id.substr(1,1)!="1" && id.substr(1,1)!="2")) {
		msg += "您填寫的身份證字號不正確！長度不正確或第二碼有誤\n";
		return msg;
	}
	str="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	val="1011121314151617341819202122352324252627282932303133";
	first=str.indexOf(id.substr(0,1));//不區分大小寫--.toUpperCase());
	if (first==-1) {
		msg += "您填寫的身份證字號不正確！首字要大寫\n";
		return msg;
	}
	for (i=2; i < 9; i++) {
	if (id.substr(i,1) >= "0" && id.substr(i,1) <= "9") continue;
		msg += "您填寫的身份證字號不正確！二到九碼必須是數字\n";
		return msg;
	}
	str1=val.substr(first*2,2);
	v1=parseInt(str1.substr(0,1));
	v2=parseInt(str1)%10;
	total=v1+v2*9+parseInt(id.substr(1,1))*8+parseInt(id.substr(2,1))*7+parseInt(id.substr(3,1))*6;
	total=total+parseInt(id.substr(4,1))*5+parseInt(id.substr(5,1))*4+parseInt(id.substr(6,1))*3;
	total=total+parseInt(id.substr(7,1))*2+parseInt(id.substr(8,1))+parseInt(id.substr(9,1));
	if ((total%10)==0) {
		return "";
	}else{
		msg += "您填寫的身份證不正確！不符合檢核規則\n";
		return msg;
	}
}
<!-- 以上是檢查身份證字號的程式 -->