//自訂FormCheck 物件
/**
* @param  array  fieldsArr (two dimensions)
*/
function FormCheck(fieldsArr){
	//properties
	this.len=fieldsArr.length;
	this.arr=fieldsArr;
	//this.hasErr=false;
	this.errMessage='';
	this.setFocusIndex=-1;
	this.file={};
	this.allowUpload=false;
	this.errSkin={solidBorder:"1px solid #CC0033", dottedBorder:"1px dotted #CC0033", bgColor:"#FFD0D0"};
	this.normalSkin={solidBorder:"1px solid #999999", dottedBorder:"1px dotted #999999", bgColor:"EAEAEA"};
	//methods
	this.hasValue=hasValue;
	//this.setErrMessage=setErrMessage;
	this.trim=trim;
	this.checkMonthRange=checkMonthRange;
	this.checkDayRange=checkDayRange;
	this.checkTimeRange=checkTimeRange;
	this.checkPassword=checkPassword;
	this.setAllowedFileType=setAllowedFileType;
	this.setErrFieldSkin=setErrFieldSkin;
	this.setFocus=setFocus;
	this.valueFormatCheck=valueFormatCheck;
	this.checkByDataType=checkByDataType;
	this.setNormalFieldSkin=setNormalFieldSkin;
	
	this.setNormalFieldSkin();
}

function setNormalFieldSkin(){
	
	for(var i=0;i<this.len;i++){
		switch(this.arr[i][0].type){
			case "text" :
				this.arr[i][0].style.border=this.normalSkin.solidBorder;
				break;
			case "password" :
				this.arr[i][0].style.border=this.normalSkin.solidBorder;
				break;
			case "file" :
				this.arr[i][0].style.border=this.normalSkin.solidBorder;
				break;
			case "textarea" :
				this.arr[i][0].style.border=this.normalSkin.dottedBorder;
				this.arr[i][0].style.background=this.normalSkin.bgColor;
			break;
		}
	}
}

/**
* 檢查這些必須要有值的欄位是否皆有值
* @return boolean
*/
function hasValue(){
	this.noValueFields=new Array();
	this.valueFields=new Array();
	for(var i=0;i<this.len;i++){
		if(this.arr[i][0].value==''){
			this.setFocus(i);
			this.setErrFieldSkin(i);
			this.noValueFields.push(this.arr[i][0]);//把未填欄位放入陣列
		}else{
			this.valueFields.push(this.arr[i]);
		}
	}
	if(this.noValueFields.length==0){ //表示欄位都填寫完畢
		return true;
	}else{
		return false;
	}
}

function valueFormatCheck(){
	var len=this.valueFields.length;
	for(var i=0;i<len;i++){
		switch (this.valueFields[i][1]){
			case "text" :
				this.checkByDataType('text',this.valueFields[i],i);
				break;
			case "int" :
				this.checkByDataType('int',this.valueFields[i],i);
				break;
			case "currency" :
				this.checkByDataType('currency',this.valueFields[i],i);
				break;
			case "file" :
				this.checkByDataType('file',this.valueFields[i],i);
				break;
			case "email" :
				this.checkByDataType('email',this.valueFields[i],i);
				break;
			case "cel" :
				this.checkByDataType('cel',this.valueFields[i],i);
				break;
			case "chinese" :
				this.checkByDataType('chinese',this.valueFields[i],i);
				break;
			case "tel" :
				this.checkByDataType('tel',this.valueFields[i],i);
				break;
			case "fax" :
				this.checkByDataType('fax',this.valueFields[i],i);
				break;
			case "url" :
				this.checkByDataType('url',this.valueFields[i],i);
				break;
			case "datetime" :
				this.checkByDataType('datetime',this.valueFields[i],i);
				break;
			
			
		}
	}
	if(this.errMessage!=''){
		throw new Error(this.errMessage);
	}
}


/**
* 依指定的欄位型態來檢查所輸入的值 *****************************************************************
* @param string type
* @param array theValueField ([0]=>表單物件, [1]=>type, [3]=>欄位的中文名稱)
* @param int i (表單元件中，有輸入值的第 i 個)
* @return void
* @access private
*/
function checkByDataType(type,theValueField,i){
	
	var obj=theValueField[0];//表單物件
	//var reg = /^\s+|\s+$/g;
	var value = obj.value;
	value = this.trim(value);//去除空白字元
	//alert(value);
	var fieldChiName=theValueField[2];
	if(type=='int'){
		//檢查是否會出現0-9以外的字元
		var check=/[^0-9]/g;
		if(value.match(check)!=null){
			this.setFocus(i);
			this.setErrFieldSkin(i);
			this.errMessage+=fieldChiName+'欄位格式並非整數!!\n';
		}
	}else if(type=='currency'){
		if(isNaN(value) || (!isNaN(value) && value<0)){
			this.setFocus(i);
			this.setErrFieldSkin(i);
			this.errMessage+=fieldChiName+'欄位格式並非合法貨幣數值!!\n';
		}
	}else if(type=='text'){
		//do nothing
	}else if(type=='file'){
		var tmpArr=value.split('\\');
		var fileName=tmpArr[tmpArr.length-1];
		var tmpExt=fileName.split('.');
		var ext=tmpExt[tmpExt.length-1];
		for(var j=0;j<this.file.allowedFileType.length;j++){
			if(ext.toLowerCase()==this.file.allowedFileType[j].toLowerCase()){
				this.allowedUpload=true;
				return;
			}
		}
		if(!this.allowedUpload){
			this.setFocus(i);
			this.setErrFieldSkin(i);
			this.errMessage+='不允許上傳 '+ext.toUpperCase()+' 類型的檔案!!\n';
		}
	}else if(type=='email'){
		var check=/^[A-Z|a-z]+[A-Z|a-z|0-9|\.|\_|-]+@+[A-Z|a-z|0-9|\.|\_|\-]+\.+[A-Z|a-z]+$/;
		var lastDotPos=value.lastIndexOf(".");
   		var len=value.length;
   		if(!value.match(check) || len-(lastDotPos+1) < 2){
			this.setFocus(i);
			this.setErrFieldSkin(i);
			this.errMessage+=fieldChiName+'欄位輸入錯誤!!\n';
		}
 	}else if(type=='url'){
		var check=/(^http:\/\/)?[A-Z|a-z|0-9]+[\_|\-]?[A-Z|a-z|0-9]+\.[A-Z|a-z|0-9]+[A-Z|a-z|0-9|\_|\-|\.]+\/?/;
		var lastDotPos=value.lastIndexOf(".");
   		var len=value.length;
		if(!value.match(check) || len-(lastDotPos+1) < 2 ){
			this.setFocus(i);
			this.setErrFieldSkin(i);
			this.errMessage+=fieldChiName+'欄位輸入錯誤!!\n';
		}
	}else if(type=='cel'){
		if(value.indexOf('-')>0){ //如果行動電話的寫法是 0921-855-527這種格式的話
			var tmp=value.split('-');
			var value='';
			for(var j=0;j<tmp.length;j++){
				value+=tmp[j];
			}
		}
		var check1=/^\d{10}$/;
		var check2=/^09\d{8}$/;
		if(!value.match(check1) || !value.match(check2)){
			this.setFocus(i);
			this.setErrFieldSkin(i);
			this.errMessage+=fieldChiName+'欄位輸入錯誤!!\n';
		}
	}else if(type=='chinese'){
		var check=/[^\u4E00-\u9FA5]/g;
		if(value.match(check)){
			this.setFocus(i);
			this.setErrFieldSkin(i);
			this.errMessage+=fieldChiName+'欄位輸入了非中文字元或空白字元!!\n';
		}
	}else if(type=='tel'){
		var check1=/^\d{3}-\d{2,3}\-\d{7,8}$/;
		var check2=/^\d{3}-\d{2,3}\-\d{7,8}#\d{1,5}$/;
		var check3=/^09\d{2}-\d{3}-\d{3}$/;
		if(!value.match(check1) && !value.match(check2) && !value.match(check3)){
			this.setFocus(i);
			this.setErrFieldSkin(i);
			this.errMessage+=fieldChiName+'欄位請依指定格式輸入!!\n';
		}
	}
	else if(type=='fax'){
		var check=/^\d{3}-\d{2,3}\-\d{7,8}$/;;
		if(!value.match(check)){
			this.setFocus(i);
			this.setErrFieldSkin(i);
			this.errMessage+=fieldChiName+'欄位請依指定格式輸入!!\n';
		}
	}else if(type=='datetime'){
		
		var check1=/^20\d{2}\-\d{2}\-\d{2}$/;
		var check2=/^20\d{2}\-\d{2}\-\d{2}\x20\d{2}:\d{2}(:\d{2})?$/;
		if(!value.match(check1) && !value.match(check2)){
			this.setFocus(i);
			this.setErrFieldSkin(i);
			this.errMessage+=fieldChiName+'欄位請依指定格式輸入!!\n';
		}else if(value.match(check1)){
			//alert("check1");
			var date=value.split('-');
			var m=date[1];
			var d=date[2];
			if(!this.checkMonthRange(m)){
				this.setFocus(i);
				this.setErrFieldSkin(i);
				this.errMessage+=fieldChiName+'欄位的日期部分之月值錯誤!!\n';
			}
			if(!this.checkDayRange(d)){
				this.setFocus(i);
				this.setErrFieldSkin(i);
				this.errMessage+=fieldChiName+'欄位的日期部分之日值錯誤!!\n';
			}
			
		}else if(value.match(check2)){
			//alert("check2");
			var datetime=value.split(" ");
			var date=datetime[0];
			date=date.split('-');
			var m=date[1];
			var d=date[2];
			var time=datetime[1];
			time = time.split(":");
			var hour=time[0];
			var minute=time[1];
			if(time[2]!=undefined) var sec=time[2];
			if(!this.checkMonthRange(m)){
				this.setFocus(i);
				this.setErrFieldSkin(i);
				this.errMessage+=fieldChiName+'欄位的日期部分之月值錯誤!!\n';
			}
			if(!this.checkDayRange(d)){
				this.setFocus(i);
				this.setErrFieldSkin(i);
				this.errMessage+=fieldChiName+'欄位的日期部分之日值錯誤!!\n';
			}
			if(!this.checkTimeRange(hour, minute, sec)){
				this.setFocus(i);
				this.setErrFieldSkin(i);
				this.errMessage+=fieldChiName+'時間部分的值有問題!!\n';
			}
			
		}
	}
}


function checkPassword(password1, password2){
	
	var value1 = password1.value;
	var value2 = password2.value;
	if(value1.length < 4 || value1.length >20){
		password1.style.border=this.errSkin.solidBorder;
		password1.focus();
		this.errMessage = "密碼長度為4-20個字元!!";
		throw new Error(this.errMessage);
	}
	if(value1 !== value2){
		password1.style.border=password2.style.border=this.errSkin.solidBorder;
		password1.value = password2.value = "";
		password1.focus();
		this.errMessage = "兩次密碼輸入不同!!";
		throw new Error(this.errMessage);
	}
	
}

/**
* 設定允許上傳的檔案類型 ******************************************************************************************
* @param array allowed
* @return void
* @access public
*/
function setAllowedFileType(allowed){
	this.file.allowedFileType=allowed;
}

/**
* 在所有輸入有問題的欄位中，找到第一個，並設定焦點 ****************************************************************
* @param int i
* @return void
* @access private
*/
function setFocus(i){
	//將第一個未填欄位設定焦點
	if(this.setFocusIndex==-1){
		this.setFocusIndex=i;
		this.arr[this.setFocusIndex][0].focus();
	}
}

function setErrFieldSkin(i){
	switch(this.arr[i][0].type){
		case "file" :
			this.arr[i][0].style.border=this.errSkin.solidBorder;
			break;
		case "text" :
			this.arr[i][0].style.border=this.errSkin.solidBorder;
			break;
		case "password" :
			this.arr[i][0].style.border=this.errSkin.solidBorder;
			break;
		case "textarea" :
			this.arr[i][0].style.border=this.errSkin.dottedBorder;
			this.arr[i][0].style.background="#FFD0D0";
			break;
	}
	//將設定焦點的表單欄位索引值回復為0
	this.setForcusIndex=0;
}

function trim(value) {
  var reg = /^\s+|\s+$/g;
  return value.replace(reg, "");
}

function checkMonthRange(m){
	if(m>12 || m=="00"){
		return false;
	}
	return true;
}

function checkDayRange(d){
	
	if(d>31 || d=="00"){
		
		return false
	}
	return true;
}

function checkTimeRange(hour, minute, sec){
	if(hour>=24){
		return false;
	}
	if(minute>=60){
		return false;
	}
	
	if(sec>=60){
		return false;
	}
	return true;
}
