//* Bug Division:
//* Flag	bug report	no		Release	Date	Author		Description
//* ----	-----------	-------	----------		--------	--------------------------------------------------
//* @D52a 	D-RUN03-009	RUN03   2001/04/24  	andytsai	fix "dataarray=3 and limit date is integer"
//**************************************************************************

var win= window;
window.onload=initial;

//initialisize
	String.prototype.isEmpty=isEmpty;
	String.prototype.isIDNo=isIDNo;
	String.prototype.isInt=isInt;
	String.prototype.isAlpha=isAlpha;
	String.prototype.isDate=isDate;
	String.prototype.isNum=isNum;
	String.prototype.isIA=isIA;
	String.prototype.isIAE=isIAE;
	String.prototype.trimSpace=trimSpace;
	String.prototype.trimSlash=trimSlash;
	String.prototype.setRange=setRange;
	String.prototype.setMin=setMin;
	String.prototype.setMax=setMax;
	String.prototype.allowChar=allowChar;
	String.prototype.unallowChar=unallowChar;
	String.prototype.allowLength=allowLength;
	String.prototype.cutLast=cutLast;
	String.prototype.toCdate=toCdate;
	String.prototype.toDate=toDate;
//檢查是否空白
function isEmpty(){
	var instring=this.toString()
	return ( instring=="" || instring==null )?true:false;

}

//檢查身份證字號是否正確
function isIDNo(){
/*
	【台灣身分證檢測規則】
	傳入一 : 欲檢驗的身分證號
	規則 : 台灣身分證字號共有十碼,我們就將它表示成...
	N1 N2 N3 N4 N5 N6 N7 N8 N9 N10
        
	N1 : 一定是一個大寫英文字母 , 代表戶籍地
	        例如A是台北市 B是台中市 C是基隆市......

	N2 : 性別欄位:1為男性 2為女性

	N3∼N9 : 流水號
	
	N10:檢測位元
    
	首先要將第一個英文字轉換成數值
    
	A>台北市 B>台中市 C>基隆市 D>台南市 E>高雄市 F>台北縣
	G>宜蘭縣 H>桃園縣 I>嘉義市 J>新竹縣 K>苗栗縣 L>台中縣
	M>南投縣 N>彰化縣 O>新竹市 P>雲林縣 Q>嘉義縣 R>台南縣
	S>高雄縣 T>屏東縣 U>花蓮縣 V>台東縣 W>金門縣 X>澎湖縣
	Y>陽明山 Z>連江縣
    
	A=10 B=11 C=12 D=13 E=14 F=15 G=16 H=17 J=18 K=19 L=20
	M=21 N=22 P=23 Q=24 R=25 S=26 T=27 U=28 V=29 X=30 Y=31
	W=32 Z=33 I=34 O=35

	然後用下列算式計算,若餘數為 0 則為正確的身分證字號
	(N1的十位數+N1的個位數x9+N2x8+N3x7+N4x6+N5x5+N6x4+N7x3+N8x2+N9+N10)÷10
*/
	var instring=this.toString()
	//比對字串
	var ref="ABCDEFGHJKLMNPQRSTUVXYWZIO"
	//取得第一個英文字母
	var FChar=instring.charAt(0).toUpperCase()
	var value=0
	var N1=0
	//進行比對
	for(i=0;i<27;i++){
		if(ref.charAt(i)==FChar) break;
	}
	//轉換成字串
	FChar=i+10+"";
	instring=FChar.charAt(0)+FChar.charAt(1)+instring.substring(1,10);
	//演算法則
	
	for(i=0;i<11;i++){
		value+=((i==0||i==10)?parseInt(instring.charAt(i)):parseInt(instring.charAt(i))*(10-i));}

    return (value%10==0)?true:false;
}

//檢查是否為數字函數
function isInt(){
	
	var instring=this.toString()
	for(i=0;i<instring.length;i++){
			if(instring.charAt(i) < "0" || instring.charAt(i) > "9") return false; 
	}
    return true;
}
//檢查是否為英文字母函數或數字函數
function isIA(){

 	var instring=this.toString()
	for(i=0;i<instring.length;i++){
		var value=instring.charAt(i)
	    if((value < "A" || value >"Z")&&(value < "a"||value > "z")&&(value < "0" || value >"9")) return false;
	}
	return true;
}
//檢查是否為英文字母函數或數字函數, 可含@.
function isIAE(){
 	var instring=this.toString()
	for(i=0;i<instring.length;i++){
		var value=instring.charAt(i)
		if((value < "A" || value >"Z")&&(value < "a"||value > "z")&&(value < "0" || value >"9")&&(value != "@" && value != ".")) return false;
	}
	return true;
}

//檢查是否為英文字母函數
function isAlpha(){

 	var instring=this.toString()
	for(i=0;i<instring.length;i++){
		var value=instring.charAt(i)
	    if(value < "A" || value >"Z"&&value < "a"||value > "z") return false;
	}
	return true;
}

//檢查日期是否正確
function isDate(){
		
		var indate=this.toString()
		var dateArray	=indate.split("/");
		//因為JavaScript日期是0-11所以要減1
		indate=new Date(dateArray[0],dateArray[1]-1,dateArray[2]);
		if ((dateArray[0] != "") && (dateArray.length==3) && (dateArray[0]+dateArray[1]+dateArray[2]).isInt() ){//是否為三維
			return (indate.getMonth()==dateArray[1]-1)?true:false;
		}else{
			return false;
		}
 
  }

 //檢查是否為數字

 function isNum(){

		var instring=this.toString()
		return (!isNaN(instring))?true:false

 }

//去除空白
function trimSpace(){
	
	var instring=this.toString()
	var value=""
	instring=instring.toString()

	for(var i=0;i<instring.length;i++){
		if(instring.charAt(i)!=" ")
			value=value+instring.charAt(i);
	}
	return value;
 }
 
//去除斜線
function trimSlash(){
	var instring=this.toString()
	var value=""
	instring=instring.toString()

	for(var i=0;i<instring.length;i++){
		if(instring.charAt(i) != "/")
			value=value+instring.charAt(i);
	}
	return value;
 }

 //檢查數字範圍
 function setRange(min,max){
 
	var instring=parseInt(this.toString());
	return (instring >= min && instring <= max)?true:false;
 }

 //檢查最大值
 function setMin(min){
 
	var instring=parseInt(this.toString());
	return (instring >= min)?true:false;
 }

 //檢查最小值
function setMax(max){
 
	var instring=parseInt(this.toString());
	return (instring >= max)?true:false;
 }

//允許的字元
function allowChar(incol){

	var instring=this.toString();
	var flag=0;

	for (i=0;i<instring.length;i++ ){
		for(j=0;j<incol.length;j++){
				if(instring.charAt(i)==incol.charAt(j)) break;
				if(j==incol.length-1) flag=1;
		}
		if(flag==1) return false;
	}
	return true;
}

//不允計字元
function unallowChar(incol){

	var instring=this.toString();

//	for (i=0;i<instring.length;i++ ){
		for(j=0;j<incol.length;j++){
			if(instring.indexOf(incol.charAt(j))>-1){
				return incol.charAt(j);
			}
		}
//	}
	return false;
}

//允許字串長度
function allowLength(){

	var instring=this.toString();

	for (i=0;i<arguments.length;i++){
			if(instring.length==arguments[i]) return true;
	}
	return false;
}



//民國年轉西元年
function toDate(){
	var tempArray=this.split("/");
	tempArray[0]=parseInt(tempArray[0])+1911;
	return tempArray.join("/");
}

//西元年轉民國年
function toCdate(){
	var tempArray=this.split("/");
	tempArray[0]=parseInt(tempArray[0])-1911;
	return tempArray.join("/");
}

//去掉最後num個字元
function cutLast(num){
  return this.substring(0,this.length-num)
}

function initial(){

	var flag=0;

	for(i=0;i<document.forms.length;i++){
		eventSet(i);
		//document.forms[i].submitCheck=submitCheck;
		document.forms[i].lock=lock;
		document.forms[i].unlock=unlock;
		for(j=0;j<document.forms[i].elements.length;j++){
			if (document.forms[i].elements[j].type=="text"||document.forms[i].elements[j].type=="file"||document.forms[i].elements[j].type=="textarea"||document.forms[i].elements[j].type=="password") {
				document.forms[i].elements[j].checkValue=checkValue;
				document.forms[i].elements[j].lockNum=lockNum;
				document.forms[i].elements[j].lockAlpha=lockAlpha;
				//繼承check屬性值
				if(document.forms[i].elements[j].cvalue) flag=1;
				if(flag==1){
					if(!document.forms[i].elements[j].cvalue) document.forms[i].elements[j].cvalue=document.forms[i].elements[j-1].cvalue;
				}
			}
		}
	}
}

//Error Message
function errmsg(index){

	var errmsg=new Array()
		errmsg[0]="這個欄位不允許空白！"
       	errmsg[1]="身份證字號需為十位數！"
		errmsg[2]="身份證字號第一個字需為英母！"
		errmsg[3]="身份證字號後九位需為數字！"
		errmsg[4]="身份證號碼錯誤！"
		errmsg[5]="請輸入數字！"
		errmsg[6]="請輸入英文字母！"
		errmsg[7]="無效的Email格式！\n\n例：userid@mail.com.tw"
		errmsg[8]="無效的郵遞區號！"
		errmsg[9]="請輸入整數！"
		errmsg[10]="無效的日期格式！\n\n例：2000/1/1"
		errmsg[11]="請輸入最少"+arguments[1]+"位數！"
		errmsg[12]="錯誤的電話號碼格式!\n\n例:02-25760000"
		errmsg[13]="還有欄位尚未填寫！"
		errmsg[14]="請填寫英文字母或整數！"
		errmsg[15]="無效的日期!"
		errmsg[16]="無效的小時格式!"
		errmsg[17]="無效的分鐘格式!"
		errmsg[18]="長度超過"+arguments[1]+"位數！"
		errmsg[19]="不允許字元[ "+arguments[1]+" ] ！"
	alert(errmsg[index]);
	
}

//事件指定
function eventSet(formi){
	document.forms[formi].onsubmit=submitCheck;
	for(j=0;j<document.forms[formi].elements.length;j++){
		//if (document.forms[0].elements[i].type=="text"||document.forms[0].elements[i].type=="file"){
			if (document.forms[formi].elements[j].cvalue){
				document.forms[formi].elements[j].onblur=checkValue;
			}
		//}
	}
}

//TextBox 的 constructor
 function textBox(obj){
	//properties
	if (obj.cvalue){
		this.checkType=obj.cvalue.charAt(0)+obj.cvalue.charAt(1);
		this.allowNull=obj.cvalue.charAt(2);
		this.minLength=obj.cvalue.substring(3,7);
		this.maxLength=obj.cmax;

	}else{
		return true;
	}
		this.value=obj.value.trimSpace();

	//method
	this.focus=obj.focus;
	this.select=obj.select;
}

//form送回server 前的Check
function submitCheck(){

	var inputobj=this.tags("input");
	var teststr = "";
	
	for(var i=0;i<inputobj.length;i++){
		if(inputobj[i].type=="text"||inputobj[i].type=="file"||inputobj[i].type=="password"){
			if(!inputobj[i].checkValue()){
				return false;
			}
			var boxobj=new textBox(inputobj[i])
			if(boxobj.allowNull==0&&boxobj.value.isEmpty()){
				errmsg(13);
				boxobj.focus();
				return false;
			}
		}
	}

	//textarea test
	var inputobj=this.tags("textarea");
	for(var i=0;i<inputobj.length;i++){
		var boxobj=new textBox(inputobj[i])
		if(!inputobj[i].checkValue()){
			return false;
		}
		if(boxobj.allowNull==0&&boxobj.value.isEmpty()){
			errmsg(13);
			boxobj.focus();
			return false;
		}
	}
	
	return true;
	
}


 //數字鎖定(使用KeyPress觸發)
 function lockNum(){

		if ((event.keyCode < 47) || (event.keyCode > 58)) 
		     event.keyCode = 0;
	
 }

 //英文字母鎖定(使用KeyPress觸發)
 function lockAlpha(){
 
	if ((event.keyCode < 65) || (event.keyCode > 90&&event.keyCode <97 ||event.keyCode >122 ))
        event.keyCode = 0;
 }

//鎖定
function lock(){

	for (i=0;i<this.elements.length;i++){
		if (this.elements[i].name=="edit") continue;
		this.elements[i].color="gray";
		this.elements[i].disabled=true;
		for(j=0;j<arguments.length;j++){
			if(this.elements[i].name==arguments[i]){this.elements[i].disabled=false;this.elements[i].color="black";}
		}
	}
}

//解除
function unlock(){
	
	for (i=0;i<this.elements.length;i++){
		if (this.elements[i].name=="edit"){this.elements[i].disabled=true;continue;}
		this.elements[i].disabled=false;
		this.elements[i].color="black";
		for(j=0;j<arguments.length;j++){
			if(this.elements[i].name==arguments[i]){this.elements[i].readOnly=true;this.elements[i].style.color="red"}
		}
	}

	for (i=0;i<this.elements.length;i++ ){
		if (this.elements[i].type=="text"&&!this.elements[i].readOnly){
			this.elements[i].focus();
			break;
		}
	}

}

//檢查身份證號碼
function idnoCheck(obj){

	with(obj){
		if(!value.charAt(0).isAlpha()){errmsg(2);obj.focus();return false;}
		if(!value.allowLength(10)){errmsg(1);obj.focus();return false;}
		if(!value.substring(1).isNum()){errmsg(3);obj.focus();return false;}
		if(!value.isIDNo()){errmsg(4);obj.focus();return false;}
	}
	return true;
}

//是否有錯誤


//檢查數字和英文字
function iaCheck(obj){

	with(obj){
		if(!value.isIA()){errmsg(14);obj.focus();return false;}
	}
	return true;
}

//檢查數字
function numCheck(obj){

	with(obj){
		if(!value.isNum()){errmsg(5);obj.focus();return false;}
	}
	return true;
}

//檢查英文字母
function alphaCheck(obj){

	with(obj){
		if(!value.isAlpha()){errmsg(6);obj.focus();return false;}
	}
	return true;
}

//檢查E-mail
function emailCheck(obj){
	with(obj){
		last = value.lastIndexOf("."); //最後一個句點位置
		laststring = value.substring(last-1,value.length);//最後一個句點之後的字串
		if(laststring.isNum()){errmsg(7);obj.focus();return false;}
		if(!value.isIAE()){errmsg(7);obj.focus();return false;}
		if(value.indexOf("@")==-1|| value.indexOf(".")==-1|| value.indexOf("@.")>=0|| value.indexOf("..")>=0
			|| value.indexOf("@")==0|| value.indexOf(".")==0){errmsg(7);obj.focus();return false;}
		return true;
	}
 }

  //檢查郵遞區號
 function zipCheck(obj){

 	with(obj){
		if(!(value.allowLength(3)&&value.isNum())){errmsg(8);obj.focus();return false;}
	}
	return true;
 }

//檢查整數
function intCheck(obj){

	with(obj){
		if(!value.isInt()){errmsg(9);obj.focus();return false;}
	}
	return true;
}

//檢查日期
function dateCheck(obj){

	with(obj){ 
		if(!value.isDate()){errmsg(10);obj.focus();return false;}
	}
	return true;
}

//檢查電話號碼
function telCheck(obj){
      var errflag=0
  with(obj){
	if(value.length < 6) {errmsg(12);obj.focus();return false;}
	else{
		for(i=0;i<value.length;i++){
			if(value.charAt(i)=="-" || value.charAt(i)=="(" || value.charAt(i)==")") continue;
			if(value.charAt(i) < "0" || value.charAt(i) > "9"){errflag=errflag+1;} 
	}
		if (errflag>0) {errmsg(12); obj.focus();return false;}
	} 
  }
  return true;
}

//檢查民國日期
function cdateCheck(obj){

	var tempArray=obj.value.split("/")
	if(tempArray.length==3){
		if(tempArray[0].isInt()&&tempArray[0].isInt()&&tempArray[0].isInt()){
			if(parseInt(tempArray[0]) <150){
				tempArray[0]=parseInt(tempArray[i])+1911;
				var temp=tempArray.join("/")
				if(temp.isDate()) return true;
			}
		}
	}
	errmsg(15);
	obj.focus();
	return false;
}

//
//檢查小時
function hourCheck(obj){

  if(obj.value.isInt()){
	if(parseInt(obj.value) <= 12 && parseInt(obj.value) >= 0) return true;
  }
  errmsg(16);
  obj.focus();
  return false;
}

//檢查分鐘
function minuteCheck(obj){

  if(obj.value.isInt()){
	if(parseInt(obj.value) <  60 && parseInt(obj.value) >= 0) return true;
  }
  errmsg(17);
  obj.focus();
  return false;
}

//#########################################################
//檢查value################################################
//#########################################################
 function checkValue(){
	//建立物件

	var boxobj=new textBox(this);
	//檢查是否為空值
	if(boxobj.value.isEmpty()){
		return true;
	}

	//檢查不允計字元
	if(boxobj.checkType!="NU"){
		//testvalue=boxobj.value.unallowChar("|`'#>&<"+'"');
		testvalue=boxobj.value.unallowChar("|`");
		if(testvalue){
			errmsg(19,testvalue);
			boxobj.focus();
			return false;
		}
	}
	//檢查位數
	if (boxobj.minLength){
		if(boxobj.value.length < boxobj.minLength){
			errmsg(11,boxobj.minLength);
			boxobj.focus();
			return false;
		}
	}
	//檢查最大位數
	if (boxobj.maxLength){
		if(boxobj.value.length > boxobj.maxLength){
			errmsg(18,boxobj.maxLength);
			boxobj.focus();
			return false;
		}
	}

    //各種格式檢查
   	var checktf=true;

	switch(boxobj.checkType){
			case "ID"://身分證號
				checktf=idnoCheck(boxobj);
				break;
			case "CN"://檢查數字
				checktf=numCheck(boxobj);
				break;
			case "CA"://檢查英文字母
				checktf=alphaCheck(boxobj);
				break;
			case "CE"://email格式
				checktf=emailCheck(boxobj);
				break;
			case "CZ"://檢查郵遞區號
				checktf=zipCheck(boxobj);
				break;
			case "CI"://檢查整數
				checktf=intCheck(boxobj);
				break;
			case "CD"://檢查日期
				checktf=dateCheck(boxobj);
				break;
			case "CT"://檢查電話號碼
				checktf=telCheck(boxobj);
				break;
			case "NA"://檢查數字和英文字
				checktf=iaCheck(boxobj);
				break;
			case "CC"://檢查民國日期
				checktf=cdateCheck(boxobj);
				break;
			case "CH"://檢查小時
				checktf=hourCheck(boxobj);
				break;
			case "CM"://檢查分鐘
				checktf=minuteCheck(boxobj);
				break;
			case "CU":
				checktf=true;
				break;
	}

	return checktf;
}
//##########################################################
