﻿var LANG__ZHO="zho";
var LANG__ZHS="zhs";
var LANG__ENG="eng";

function validateForm(f,fids,fnames,validators){
	return _validateForm(f,fids,fnames,validators,true,LANG__ZHO);
}
function validateForm1(f,fids,fnames,validators,checkRequired){
	return _validateForm(f,fids,fnames,validators,checkRequired,LANG__ZHO);
}
function validateForm2(f,fids,fnames,validators,lang){
	if(lang==LANG__ZHO || lang==LANG__ZHS){
		return _validateForm(f,fids,fnames,validators,true,LANG__ZHO);
	}
	if(lang==LANG__ENG){
		return _validateForm(f,fids,fnames,validators,true,LANG__ENG);
	}
	return false;
}
function validateSingleEle(f,fid,fname,validator,lang){
	var FD=new Array(1);
	var FN=new Array(1);
	var FV=new Array(1);

	FD[0]=fid;
	FN[0]=fname;
	FV[0]=validator;

	return validateForm2(f,FD,FN,FV,lang);
}


function _validateForm(f,fids,fnames,validators,checkRequired,lang){
	//fid = "2# A,B"
	//fnames = "2# AN,BN"
	//validators = "GT"

	var v="";
	var msg="";
	var ele_msg="";
	var numOfParam=0;
	var fid1="";
	var fid2="";
	var fid3="";
	var fid4="";
	var f1="";
	var f2="";
	var f3="";
	var f4="";
	var fname1="";
	var fname2="";
	var fname3="";
	var fname4="";
	var isDisabled1=false;
	var isDisabled2=false;
	var isDisabled3=false;
	var isDisabled4=false;
	var ele1;
	var ele2;
	var ele3;
	var ele4;
	for(var i=0;i<fids.length;i++){
		numOfParam=getNumOfParam(fids[i]);
		if(numOfParam==1){
			ele1=f.elements[fids[i]];
			ele1.value=trim(ele1.value);
			
			isDisabled1=isDisabled(ele1);
			if(isDisabled1){
				setDisabled(ele1,false);
			}
			v=validateEle(ele1.value,validators[i],checkRequired);
			if(isDisabled1){
				setDisabled(ele1,true);
			}
			
			ele_msg=getValidationMsg(fnames[i],v,lang);
			if(msg.indexOf(ele_msg)<0){
				msg+=ele_msg;
			}
		}else
		if(numOfParam==2){
			fid1=getParam(f,fids[i],0);
			fid2=getParam(f,fids[i],1);
			ele1=f.elements[fid1];
			ele2=f.elements[fid2];
			ele1.value=trim(ele1.value);
			ele2.value=trim(ele2.value);
			f1=ele1.value;
			f2=ele2.value;
			fname1=getParam(f,fnames[i],0);
			fname2=getParam(f,fnames[i],1);
			isDisabled1=isDisabled(ele1);
			isDisabled2=isDisabled(ele2);

			if(isDisabled1){
				setDisabled(ele1,false);
			}
			if(isDisabled2){
				setDisabled(ele2,false);
			}

			v=validateEle2P(f1,f2,validators[i]);
			msg+=getValidationMsg2P(fname1,fname2,v,lang);

			if(isDisabled1){
				setDisabled(ele1,true);
			}
			if(isDisabled2){
				setDisabled(ele2,true);
			}
		}else
		if(numOfParam==4){
			fid1=getParam(f,fids[i],0);
			fid2=getParam(f,fids[i],1);
			fid3=getParam(f,fids[i],2);
			fid4=getParam(f,fids[i],3);
			ele1=f.elements[fid1];
			ele2=f.elements[fid2];
			ele3=f.elements[fid3];
			ele4=f.elements[fid4];
			ele1.value=trim(ele1.value);
			ele2.value=trim(ele2.value);
			ele3.value=trim(ele3.value);
			ele4.value=trim(ele4.value);
			f1=ele1.value;
			f2=ele2.value;
			f3=ele3.value;
			f4=ele4.value;
			fname1=getParam(f,fnames[i],0);
			fname2=getParam(f,fnames[i],1);
			fname3=getParam(f,fnames[i],2);
			fname4=getParam(f,fnames[i],3);
			isDisabled1=isDisabled(ele1);
			isDisabled2=isDisabled(ele2);
			isDisabled3=isDisabled(ele3);
			isDisabled4=isDisabled(ele4);

			if(isDisabled1) setDisabled(ele1,false);
			if(isDisabled2) setDisabled(ele2,false);
			if(isDisabled3) setDisabled(ele3,false);
			if(isDisabled4) setDisabled(ele4,false);

			v=validateEle4P(f1,f2,f3,f4,validators[i]);
			msg+=getValidationMsg4P(fname1,fname2,fname3,fname4,v,lang);

			if(isDisabled1)	setDisabled(ele1,true);
			if(isDisabled2) setDisabled(ele2,true);
			if(isDisabled3)	setDisabled(ele3,true);
			if(isDisabled4) setDisabled(ele4,true);
		}
	}
	if(msg.length==0){
		return true;
	}else{
		if(lang==LANG__ZHO){
			alert("<以下的資料不正確, 請修改>\n\n"+msg);
		}else
		if(lang==LANG__ENG){
			alert("Please check the following fields\n\n"+msg);
		}
		return false;
	}
}

function isDisabled(ele){
if(ele.type=="text"){
	return ele.disabled;
}
return false;
}

function setDisabled(ele,b){
if(ele.type=="text"){
	ele.disabled=b;
}
}

function getNumOfParam(fid){
	var n=parseInt(fid.substr(0,1));
	var s=fid.substr(1,1);
	if(!isNaN(n) && s=="#"){
		return n;
	}else{
		return 1;
	}
}


function getParam(f,fid,k){
	var n=getNumOfParam(fid);
	if(k>=n) return "";

	var s=fid.substr(2,fid.length-2);
	var p=s.split(",");
	if(k>=p.length){
		return "";
	}else{
		p[k]=trim(p[k]);
		return p[k];
	}
}


function getValidationMsg(fname,validator,lang){
	if(validator.length==0){
		return "";
	}
	if(validator=="R"){
		if(lang==LANG__ZHO) return "- 請輸入 "+fname+"\n";
		if(lang==LANG__ENG) return "- Please fill in "+fname+"\n";
		return "";
	}else if (validator=="A"){
		if(lang==LANG__ZHO) return "- "+fname+" 必須由 英文字母(A-Z,a-z) 或 數字(0-9) 所組成\n";
		if(lang==LANG__ENG) return "- "+fname+" must make up of alphanumeric charactors\n";
		return "";
	}else if (validator=="D"){
		if(lang==LANG__ZHO) return "- "+fname+" 的日期格式不正確, 請用 dd/mm/yyyy 日期格式\n";
		if(lang==LANG__ENG) return "- Date format of "+fname+" must be dd/mm/yyyy\n";
		return "";
	}else if (validator=="T"){
		if(lang==LANG__ZHO) return "- "+fname+" 的時間格式不正確, 請用 hh:mm 時間格式\n";
		if(lang==LANG__ENG) return "- Time format of "+fname+" must be hh:mm\n";
		return "";
	}else if (validator=="NUM"){
		if(lang==LANG__ZHO) return "- "+fname+" 必須由 數字(0-9) 所組成\n";
		if(lang==LANG__ENG) return "- "+fname+" must be a number\n";
		return "";
	}else if (validator=="I"){
		if(lang==LANG__ZHO) return "- "+fname+" 不是一個正整數\n";
		if(lang==LANG__ENG) return "- "+fname+" must be an integer\n";
		return "";
	}else if (validator=="F"){
		if(lang==LANG__ZHO) return "- "+fname+" 不是一個正點數\n";
		if(lang==LANG__ENG) return "- "+fname+" must be a positive decimal number\n";
		return "";
	}else if (validator=="SF"){
		if(lang==LANG__ZHO) return "- "+fname+" 不是一個正/負點數\n";
		if(lang==LANG__ENG) return "- "+fname+" must be a signed decimal number\n";
		return "";
	}else if (validator=="GTZ"){
		if(lang==LANG__ZHO) return "- "+fname+" 必須大於零\n";
		if(lang==LANG__ENG) return "- "+fname+" must be greater than zero\n";
		return "";
	}else if (validator=="GEZ"){
		if(lang==LANG__ZHO) return "- "+fname+" 不可小於零\n";
		if(lang==LANG__ENG) return "- "+fname+" must be greater than or equal zero\n";
		return "";
	}else if (validator=="NLT"){
		if(lang==LANG__ZHO) return "- "+fname+" 必須是今天或之前的日期\n";
		if(lang==LANG__ENG) return "- "+fname+" must be today or dates before today\n";
		return "";
	}else if (validator=="LET"){
		if(lang==LANG__ZHO) return "- "+fname+" 必須是今天或之後的日期\n";
		if(lang==LANG__ENG) return "- "+fname+" must be today or dates after today\n";
		return "";
	}else if (validator=="ET"){
		if(lang==LANG__ZHO) return "- "+fname+" 必須是今天\n";
		if(lang==LANG__ENG) return "- "+fname+" must be today\n";
		return "";
	}else if (validator=="EMAIL"){
		if(lang==LANG__ZHO) return "- "+fname+" 格式不正確\n";
		if(lang==LANG__ENG) return "- "+fname+" must be a validate email address\n";
		return "";
	}else if (validator=="CCSC"){
		if(lang==LANG__ZHO) return "- "+fname+" 不正確\n";
		if(lang==LANG__ENG) return "- "+fname+" is invalid\n";
	}else if (validator=="FILE_EXT"){
		if(lang==LANG__ZHO) return "- "+fname+" 不正確\n";
		if(lang==LANG__ENG) return "- "+fname+" is invalid\n";
	}else if (validator=="NUM8"){
		if(lang==LANG__ZHO) return "- "+fname+" 必須是 8 位數字\n";
		if(lang==LANG__ENG) return "- "+fname+" must be a 8-digit number\n";
	}
	return "";
}


function getValidationMsg2P(fname1,fname2,validator,lang){
	if (validator.length==0){
		return "";
	}

	if (validator=="GT"){
		if(lang==LANG__ZHO) return "- "+fname1+" 必須大於 "+fname2+"\n";
		if(lang==LANG__ENG) return "- "+fname1+" must be greater than "+fname2+"\n";
	}
	if (validator=="GE"){
		if(lang==LANG__ZHO) return "- "+fname1+" 不可小於 "+fname2+"\n";
		if(lang==LANG__ENG) return "- "+fname1+" must be greater than or equal "+fname2+"\n";
	}
	if (validator=="LE"){
		if(lang==LANG__ZHO) return "- "+fname1+" 不可超過 "+fname2+"\n";
		if(lang==LANG__ENG) return "- "+fname1+" cannot exceed "+fname2+"\n";
	}
	if (validator=="LE10"){
		if(lang==LANG__ZHO) return "- "+fname1+" 不可超過 "+fname2+" 10%\n";
		if(lang==LANG__ENG) return "- "+fname1+" cannot exceed "+fname2+" for 10%\n";
	}
	if (validator=="EQ"){
		if(lang==LANG__ZHO) return "- "+fname1+" 必須與 "+fname2+" 相同\n";
		if(lang==LANG__ENG) return "- "+fname1+" must be equal "+fname2+"\n";
	}
	if (validator=="NEQ"){
		if(lang==LANG__ZHO) return "- "+fname1+" 不可與 "+fname2+" 相同\n";
		if(lang==LANG__ENG) return "- "+fname1+" must not equal "+fname2+"\n";
	}
	if (validator=="D_LE"){
		if(lang==LANG__ZHO) return "- "+fname1+" 不可早過 "+fname2+"\n";
		if(lang==LANG__ENG) return "- "+fname1+" must be earlier or equal "+fname2+"\n";
	}
	if (validator=="D_GE"){
		if(lang==LANG__ZHO) return "- "+fname1+" 不可遲過 "+fname2+"\n";
		if(lang==LANG__ENG) return "- "+fname1+" must be later or equal "+fname2+"\n";
	}
	if (validator=="PWD"){
		if(lang==LANG__ZHO) return "- "+fname1+" 必須與 "+fname2+" 相同\n";
		if(lang==LANG__ENG) return "- "+fname1+" must be the same as "+fname2+"\n";
	}
	if (validator=="CCEXP"){
		if(lang==LANG__ZHO) return "- "+fname1+" 必須是本月之後的月份\n";
		if(lang==LANG__ENG) return "- "+fname1+" cannot be earlier than this month\n";
	}

	return "";
}

function getValidationMsg4P(fname1,fname2,fname3,fname4,validator,lang){
	if (validator.length==0){
		return "";
	}

	if (validator=="T_LE"){
		if(lang==LANG__ZHO) return "- "+fname3+" 不可早過 "+fname1+"\n";
		if(lang==LANG__ENG) return "- "+fname3+" must be earlier or equal "+fname1+"\n";
	}
	if (validator=="PACK"){
		if(lang==LANG__ZHO) return "- "+fname1+" 必須等於 "+fname2+" x "+fname3+" + "+fname4+"\n";
		if(lang==LANG__ENG) return "- "+fname3+" must be equal "+fname1+"\n";
	}
	if (validator=="CCNO"){
		if(lang==LANG__ZHO) return "- "+fname1+" 不正確\n";
		if(lang==LANG__ENG) return "- "+fname1+" must be a valid Credit Card No.\n";
	}
	return "";
}


function validateEle(s,validator,checkRequired){
if (validator.length==0){
	return "";
}
if (hasValidator(validator,"R") && checkRequired && isBlank(s)){
	return "R";
}
if (isBlank(s)){
	return "";
}
if (hasValidator(validator,"A") && !isAlphanumeric(s)){
	return "A";
}
if (hasValidator(validator,"NUM") && !isInteger(s)){
	return "NUM";
}
if (hasValidator(validator,"I") && !isInteger(s)){
	return "I";
}
if (hasValidator(validator,"D") && !isDate(s)){
	return "D";
}
if (hasValidator(validator,"T") && !isTime(s)){
	return "T";
}
if (hasValidator(validator,"F") && !isFloat(s)){
	return "F";
}
if (hasValidator(validator,"SF") && !isSignedFloat(s)){
	return "SF";
}
if (hasValidator(validator,"GTZ") && isFloat(s)){
	var i=parseFloat(s,10);
	if(i<=0) return "GTZ";
}
if (hasValidator(validator,"GEZ") && isFloat(s)){
	var i=parseFloat(s,10);
	if(i<0) return "GEZ";
}
if (hasValidator(validator,"NLT") && isDate(s)){
	if(!isToday(s) && laterThanToday(s)) return "NLT";
}
if (hasValidator(validator,"LET") && isDate(s)){
	if(!isToday(s) && !laterThanToday(s)) return "LET";
}
if (hasValidator(validator,"ET") && isDate(s)){
	if(!isToday(s)) return "ET";
}
if (hasValidator(validator,"EMAIL") && !isValidEmail(s)){
	return "EMAIL";
}
if(hasValidator(validator,"CCSC")){
	if(!isInteger(s)) return "CCSC";
	var v=new String(s);
	if(v.length!=3) return "CCSC";
}

if(hasValidator(validator,"FILE_EXT") && !checkSecureFileExt(s)){
	return "FILE_EXT";
}

if(hasValidator(validator,"NUM8")){
	if(!isInteger(s)) return "NUM8";
	var v=new String(s);
	if(v.length!=8) return "NUM8";
}

return "";
}

function validateEle2P(s1,s2,validator){
var v1;
var v2;
if (validator.length==0){
	return "";
}
if (hasValidator(validator,"PWD")){
	if(s1!=s2){
		return "PWD";
	}
}


if(isBlank(s1)||isBlank(s2)){
	return "";
}
if (hasValidator(validator,"GT") && isFloat(s1) && isFloat(s2)){
	v1=parseFloat(s1,10);
	v2=parseFloat(s2,10);
	if(!(v1>v2)){
		return "GT";
	}
}
if (hasValidator(validator,"GE") && isFloat(s1) && isFloat(s2)){
	v1=parseFloat(s1,10);
	v2=parseFloat(s2,10);
	if(!(v1>=v2)){
		return "GE";
	}
}
if (hasValidator(validator,"LE") && isFloat(s1) && isFloat(s2)){
	v1=parseFloat(s1,10);
	v2=parseFloat(s2,10);
	if(!(v1<=v2)){
		return "LE";
	}
}
if (hasValidator(validator,"LE10") && isFloat(s1) && isFloat(s2)){
	v1=parseFloat(s1,10);
	v2=parseFloat(s2,10);
	if(!(v1<=v2*1.1)){
		return "LE10";
	}
}
if (hasValidator(validator,"EQ") && isFloat(s1) && isFloat(s2)){
	v1=parseFloat(s1,10);
	v2=parseFloat(s2,10);
	if(v1!=v2){
		return "EQ";
	}
}
if (hasValidator(validator,"NEQ") && isFloat(s1) && isFloat(s2)){
	v1=parseFloat(s1,10);
	v2=parseFloat(s2,10);
	if(v1==v2){
		return "NEQ";
	}
}
if (hasValidator(validator,"D_LE") && isDate(s1) && isDate(s2)){
	if(compareDateTime(s1,"00:00",s2,"00:00")<0){
		return "D_LE";
	}
}
if (hasValidator(validator,"D_GE") && isDate(s1) && isDate(s2)){
	if(compareDateTime(s1,"00:00",s2,"00:00")>0){
		return "D_GE";
	}
}
if(hasValidator(validator,"CCEXP") && isInteger(s1) && isInteger(s2)){
	v1=new Date(
		parseInt(s2,10)
		,parseInt(s1,10)-1
		,1);
	v2=new Date();
	if(v2.getTime()>=v1.getTime()){
		return "CCEXP";
	}
}

return "";
}


function validateEle4P(s1,s2,s3,s4,validator){
var v1;
var v2;
var v3;
var v4;
if (validator.length==0){
	return "";
}
if(hasValidator(validator,"CCNO")){
	if(!isInteger(s1) || isBlank(s1)) return "CCNO";
	if(!isInteger(s2) || isBlank(s2)) return "CCNO";
	if(!isInteger(s3) || isBlank(s3)) return "CCNO";
	if(!isInteger(s4) || isBlank(s4)) return "CCNO";

	v1=new String(s1);
	v2=new String(s2);
	v3=new String(s3);
	v4=new String(s4);

	if(v1.length!=4) return "CCNO";
	if(v2.length!=4) return "CCNO";
	if(v3.length!=4) return "CCNO";
	if(v4.length!=4) return "CCNO";
}

if(isBlank(s1)||isBlank(s2)||isBlank(s3)||isBlank(s4)){
	return "";
}
if(hasValidator(validator,"T_LE") && isDate(s1) && isTime(s2) && isDate(s3) && isTime(s4)){
	if(compareDateTime(s1,s2,s3,s4)>=0){
		return "T_LE";
	}
}
if(hasValidator(validator,"PACK") && isInteger(s1) && isInteger(s2) && isInteger(s3) && isInteger(s4)){
	v1=parseFloat(s1,10);
	v2=parseFloat(s2,10);
	v3=parseFloat(s3,10);
	v4=parseFloat(s4,10);
	if(v1!=v2*v3+v4){
		return "PACK";
	}
}

return "";
}



function hasValidator(validator,s){
	var v=","+validator+",";
	return v.indexOf(","+s+",")>=0;
}

function isBlank(v){
    return (v.length==0);
}


function isDate(s) {
    if (s.length!=10) return false;
    var dd=s.substr(0,2);
    var mm=s.substr(3,2);
    var yyyy=s.substr(6,4);
    
    if (s.substr(2,1)!="/" || s.substr(5,1)!="/") {
      return false;
    }    

    if ( (!isInteger(dd)) || (dd>31) || (dd<=0) ) {
      return false;
    }

    if ( (!isInteger(mm)) || (mm>12) || (mm<=0) ) {
      return false;
    }

    if (!isInteger(yyyy)) {
      return false;
    }

    if (mm==2) {
        if (yyyy%4 != 0){
            if (dd>28){
                //The max.Date of that Month is 28
	            return false;
	        }
        }
        else if  (yyyy%400 == 0){
            if (dd>29){
                //The max.Date of that Month is 29
	            return false;
	        }
        }
        else if (yyyy%100 == 0){
            if (dd>28){
                //The max.Date of that Month is 28"
	            return false;
	        }
        }
        else{
            if (dd>29){
                //The max.Date of that Month is 28"
	            return false;
	        }
        }
       
    }
    
    if ( (dd>=31) && (mm==2 || mm==4 || mm==6 || mm==9 || mm==11) ) {
        //The max.Date of that Month is 30
      return false;
    }
    return true;
}

function isTime(s) {
    var str=new String(s);
    
    if (str.length != 5 || str.substr(2,1) != ":" )
    {
        return false;
    }
    var hh = str.substr(0,2);
    var mm = str.substr(3,2);
    
    if ((!isInteger(hh)) || hh>23 || hh <00){
	return false;
    }
    if ((!isInteger(mm)) || mm>59 || mm <00){
	return false;
    }

    return true;
}


function unionArray(a1,a2){
var j=0;
var r=new Array(a1.length+a2.length);
for(var i=0;i<a1.length;i++){
	r[j++]=a1[i];
}
for(var i=0;i<a2.length;i++){
	r[j++]=a2[i];
}
return r;
}


function compareDateTime(date_s1,time_s1,date_s2,time_s2){
	var d1=getDateTimeByString(date_s1,time_s1);
	var d2=getDateTimeByString(date_s2,time_s2);
	if(d1.getTime()>d2.getTime()){
		return 1;
	}
	if(d1.getTime()<d2.getTime()){
		return -1;
	}
	if(d1.getTime()==d2.getTime()){
		return 0;
	}

}

function isValidEmail(email){
	if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,5})+$/.test(email)){
        	return true;
	}
	return false;
}

function checkSecureFileExt(file){
	var EXTs=new Array("jsp","php","xml","js");
	var ext=_getFileExt(file);
	for(var i=0;i<EXTs.length;i++){
		if(ext.toUpperCase()==EXTs[i].toUpperCase()){
			return true;
		}
	}
	return false;
}

function _getFileExt(file){
	var s=new String(file);
	var k=s.lastIndexOf(".");
	if(k<0)	return "";

	return s.substring(k+1,s.length);
}
