/////////////////////////////////////////////////////////////
//                Setup Class Names
/////////////////////////////////////////////////////////////
//default classes for infobox
var infoboxOkClass		= "OkMsg";
var infoboxWarningClass	= "WarningMsg";
var infoboxErrorClass	= "ErrorMsg";
var infoboxHintClass	= "HintMsg";
//default classes for input field
var inputWarningClass	= "Warning";
var inputErrorClass		= "Error";
var inputOkClass		= "Ok";
var inputNormalClass	= "Normal";


/////////////////////////////////////////////////////////////
//                Initialize Form
/////////////////////////////////////////////////////////////
function initForm(){
	//initialize form UI and add triggers
	var infobox;
	var x = document.getElementById("Content");
	if(!x) return;
	var y = x.getElementsByTagName("input");
	for (var i=0;i<y.length;i++){
		if(y[i].type == 'text' || y[i].type == 'password'){
			initStatus(y[i],true);
			setFiledWidth(y[i]);
			y[i].onfocus	= getFocus;
			y[i].onblur		= lostFocus;
			y[i].onkeyup	= showMyStatus;
		}
		if(y[i].type == "checkbox" ){
			initStatus(y[i],false);
			y[i].onfocus	= getFocus;
			y[i].onblur		= lostFocus;
			y[i].onkeyup	= showMyStatus;
		}
	}
}
function initStatus(obj,isInput){
	if(isInput){
		if(isRequired(obj)) showStatus(obj,"Warning");
		else showStatus(obj,"Normal");
	}

	var infobox = getInfobox(obj);
	var errorCode = getInitStatus(obj);
	if(infobox && infobox.innerHTML == ""){
		if(!errorCode || errorCode == 0){
			infobox.className	= infoboxHintClass;
			infobox.innerHTML	= getErrorMsg(obj,0);
		}
		if(errorCode >0){
			infobox.className	= infoboxErrorClass;
			infobox.innerHTML	= getErrorMsg(obj,errorCode);
		}
	}
}
/////////////////////////////////////////////////////////////
//                Base Functions
/////////////////////////////////////////////////////////////
function isIE() {
	if(document.all) return true;
	return false;
}
function setFiledWidth(obj){
	obj.style.width=(19/3)*obj.size+11;
}
function formEle(required,datatype,parameter,infobox,errormsg,combine,status){
	this.r	= required;
	this.d	= datatype;
	this.p	= parameter;
	this.i	= infobox;
	this.e	= errormsg;
	this.c = combine;
	this.s = status;
}
function isRequired(obj){
	if(obj.id){
		if(eval(obj.id).r) return eval(obj.id).r;
	}
	return false;
}
function isCombine(obj){
	if(obj.id){
		if(eval(obj.id).c) return eval(obj.id).c;
	}
	return false;
}
function getDatatype(obj){
	if(obj.id){
		if(eval(obj.id).d) return eval(obj.id).d;
	}
	return false;
}
function getInfobox(obj){
	if(obj.id){
		if(eval(obj.id).i && document.getElementById(eval(obj.id).i)) return document.getElementById(eval(obj.id).i);
	}
	return;
}

function getErrorMsg(obj,errorCode){
	if(obj.id){
		if(eval(obj.id).e[errorCode]) return eval(obj.id).e[errorCode];
	}
	return;
}
function getHintMsg(obj){
	if(obj.id){
		if(eval(obj.id).e[0]) return eval(obj.id).e[0];
	}
	return;
}
function getInitStatus(obj){
	if(obj.id){
		if(eval(obj.id).s || eval(obj.id).s==0 ) return eval(obj.id).s;
	}
	return;
}
function getAttrName(str){
	var s=str.split("=");
	return s[0];
}
function getAttrValue(str){
	var s=str.split("=");
	return s[1];
}
function getAttrValueByName(obj,str){
	var para;
	if(obj.id){
		if(eval(obj.id).p) para=eval(obj.id).p;
		else return;
	}else{
		return;
	}
	var s = para.split(",");
	for(var i=0;i<s.length;i++){
		if(getAttrName(s[i]) == str){
			if(getAttrValue(s[i]))
				return getAttrValue(s[i]);
			else
				return;
		}
	}
	return;
}
function getMailServer(str){
	//be sure str is a correct email address
	str = str.trim();
	return str.substr(str.indexOf("@")+1);
}
function getMailAccount(str) {
	str = str.trim();
	return str.substr(0, str.indexOf("@"));
}
function isNumber(str) {
	var patn = new RegExp("^\\d{1,15}$");
	if (patn.test(str)) {
		return true;
	} else {
		return false;
	}
}

String.prototype.trim = function()
{
    return this.replace(/(^\s*)|(\s*$)/g, "");
}

/////////////////////////////////////////////////////////////
//                UI Functions
/////////////////////////////////////////////////////////////
function getFocus(evnt)
{
	var obj;
	if (isIE()) {
		obj = event.srcElement;
	}else {
		obj = evnt.target;
	}
	showInfo(obj,0);
}
function lostFocus(evnt)
{
	var obj;
	if (isIE()) {
		obj = event.srcElement;
	}else {
		obj = evnt.target;
	}
	showInfo(obj,-1);
}
function showInfo(obj,errorCode,forcible)
//Show Information in Infobox
//errorCode==0 for hint message
//if forcible==true, no matter what the status of infobox now, change it,
//otherwise,if the status of infobox is "Error", do not change it forever.
{
	var infobox = getInfobox(obj);
	if(infobox){
		if(infobox.className != infoboxErrorClass || forcible){
			if(errorCode == 0){
				infobox.className	= infoboxWarningClass;
				infobox.innerHTML	= getErrorMsg(obj,errorCode);
			}
			if(errorCode >0){
				infobox.className	= infoboxErrorClass;
				infobox.innerHTML	= getErrorMsg(obj,errorCode);
			}
			if(errorCode <0){
				infobox.className	= infoboxHintClass;
			}
		}
	}
}
function showMyStatus(evnt){
	var obj,errorCode;
	if (isIE()) {
		obj = event.srcElement;
	}else {
		obj = evnt.target;
	}
	errorCode = validateValue(obj);
	if(errorCode == 0){
		showStatus(obj,"Ok");
	}
	if(errorCode >= 1){
		showStatus(obj,"Error");
	}
	if(errorCode < 0){
		showStatus(obj,"Normal");
	}
}
function showStatus(obj,stat)
//Show the status of user currently inputting field
//3 Statuses: Warning|Error|Ok
{
	switch(stat){
		case "Warning":
			obj.className = inputWarningClass;
			getInfobox(obj).innerHTML	= getErrorMsg(obj,0);
			break;
		case "Error":
			obj.className = inputErrorClass;
			getInfobox(obj).className	= infoboxErrorClass;
			getInfobox(obj).innerHTML	= getErrorMsg(obj,0);
			break;
		case "Ok":

			obj.className = inputOkClass;
			getInfobox(obj).className	= infoboxOkClass;
			getInfobox(obj).innerHTML	= getErrorMsg(obj,0);
			break;
		default:
			obj.className = inputNormalClass;
			break;
	}
}
/////////////////////////////////////////////////////////////
//                Validator Functions
/////////////////////////////////////////////////////////////
function validateValue(obj){
	//trim
	var patn = /(^\s)|(\s$)/;
	if(patn.test(obj.value))	obj.value = obj.value.trim();
	//switcher
	var errorCode = -1;
	switch(getDatatype(obj)){
		case "username":
			errorCode = validateUsername(obj);
			break;
        case "cardcode":
            errorCode = validateCardCode(obj);
            break;
		case "cardtype":
			errorCode = validateCardType(obj);
			break;
		case "pwd":
			errorCode = validatePassword(obj);
			break;
		case "safepassword":
			errorCode = validateSafePassword(obj);
			break;
		case "mirror":
			errorCode = validateMirror(obj);
			break;
		case "email":
			errorCode = validateEmail(obj);
			break;
		case "emailNew": // add by huanghuajun 0712
			errorCode = validateEmailNew(obj);
			break;
		case "uname":
		  errorCode = validateRealName(obj);
		  break;
	        case "ssn":
	  	  errorCode = validateSsn(obj);
		  break;
		case "Question2":
		  errorCode = validateQuestion(obj);
		  break;
		case "Answer2":
		  errorCode = validateAnswer(obj);
		  break;
		case "safecode":
	  	  errorCode = validateSafecode(obj);
		  break;
		case "mirror":
			errorCode = validateMirror(obj);
			break;
		case "checkcode":
			errorCode = validateCheckCode(obj);
			break;
		case "mobile":
			errorCode = validateMobile(obj);
			break;
		case "rolename": //驗證遊戲角色名稱
            errorCode = validateRolename(obj);
            break;
        case "keepername": //驗證監護人姓名
            errorCode = validateKName(obj);
            break;
        case"keepercardcode": //驗證監護人身份證
            errorCode = validateKCardCode(obj);
            break;
        case"keeperfooting": //驗證監護人關係
            errorCode = validateKFooting(obj);
            break;

		default:
			errorCode = -1;
			break;
	}
	return errorCode;
}

/*監護人關係*/
function validateKFooting(obj){
    var str = obj.value;
	var patn = /^([\u4e00-\u9fa5])+$/;    
    if(str.len()<4 || str.len()>10) {
    		return 1;
    	}
		else if (!patn.test(str)) {
			return 2;
		} else {
			return 0;
		}
}
/*監護人姓名*/
function validateKName(obj){
    var str = obj.value;
	var patn = /^([\u4e00-\u9fa5])+$/;    
    if(str.len()<4 || str.len()>8) {
    		return 1;
    	}
		else if (!patn.test(str)) {
			return 2;
		} else {
			return 0;
		}
}
/*監護人身份證號碼驗證*/
function validateKCardCode(obj){
    var str = obj.value;
    var patn = /^(\d{18}|\d{17}[xX]|\d{15})$/;
    if(!patn.test(str)){
        return 1;
    }  

    var y,m,d,r,f
    if (str.length==15)
    {
        y = str.substr(6,2);
        m = str.substr(8,2);
            if(m>12 || m<1){
                return 2;
            }
        d = str.substr(10,2);
            if(d<1 || d>31){
                 return 0;
            }
        try
        {
            y = 1900 + parseInt(y);
        }
        catch(e)
        {}
    } else if (str.length==18) {
        y = str.substr(6,4);
        m = str.substr(10,2);
        
        if(m>12 || m<1){
            return 2;
        }
        d = str.substr(12,2);
        if(d<1 || d>31){
            return 2;
        }
    }
	else
	{
		return 0;
	}
    r = new Date(parseInt(y)+parseInt(18),parseInt(m)-1,d);
    f = new Date();
    if(r>f)
    {
        return 1;
    }
    else
    {
        return 0;
    }
    return 0;
}

function validateAll(formObj){
	var obj,infobox,pass;
	pass = true;
	var x = formObj;
	if(!x) return;
	var y = x.getElementsByTagName("input");
	var keyselected;
	var keyObj;	
  	keyObj="email";
  	
for (var i=0;i<y.length;i++){
		obj = y[i];
		obj.value = obj.value.trim();
		if(obj.type =='image'){
			continue;
		}
				
		infobox = getInfobox(y[i]);
		
	    if(obj.style.display == "none")
	    {	    
	        continue;
	    }
		
		if(obj.type =='checkbox') {
				if(validateRule(obj)>0){
					pass = false;
					obj.focus();
					showStatus(obj,"Error");
					infobox.className	= infoboxErrorClass;
					infobox.innerHTML	= requireErrorInfo + getErrorMsg(obj,1);
					if(isCombine(obj)) break;
					continue;
				}
				if(validateRule(obj)==0){
					showStatus(obj,"Ok");
					infobox.className	= infoboxHintClass;
					infobox.innerHTML	= selectedInfo;
					continue;
				}
			}
		if((obj.type == 'text' || obj.type == 'password')){
				if(!isRequired(obj) && obj.value == ""){
					continue;
				}
				if(isRequired(obj) && obj.value == ""){
					pass = false;
					obj.focus();
					showStatus(obj,"Error");
					infobox.className	= infoboxErrorClass;
					infobox.innerHTML	= requireErrorInfo + getErrorMsg(obj,0);
					if(isCombine(obj)) break;
					continue;
				}
				if(validateValue(obj)>0){
					pass = false;
					obj.focus();
					showStatus(obj,"Error");
					showInfo(obj,validateValue(obj),true);
					if(isCombine(obj)) break;
					continue;
				}
				if(validateValue(obj)==0){
					showStatus(obj,"Ok");
					infobox.className	= infoboxHintClass;
					infobox.innerHTML	= validatedInfo;
					continue;
				}
			}			
	}
	return pass;
}

//創建角色驗證區:角色名
function validateRolename(obj){
	var str = obj.value;
	//var patn =   /^[\u0391-\uFFE5a-zA-Z0-9][\u0391-\uFFE5\w]{2,20}$/;
	var patn = /[\u4e00-\u9fa5][0-9a-zA-Z]\w{4,16}[0-9a-zA-Z]$/;
	if(patn.test(str)){
		return 0;
	}
	return 1;
}




// not _ at the start side or the end side
function validateUsername(obj){
	var str = obj.value;
	//var patn =   /^[\u0391-\uFFE5a-zA-Z0-9][\u0391-\uFFE5\w]{2,20}$/;
	var patn = /^[0-9a-zA-Z]{4,18}$/;
	if(patn.test(str)){
		return 0;
	}
	return 1;
}


function validateRealName(obj){
    var str = obj.value;
	// str length
	// include chinese or letter
	var patn = /^[\u4e00-\u9fa5]+$/;    
    if(str.len()<4 || str.len()>8) {
    		return 1;
    	}
		else if (!patn.test(str)) {
				return 2;
		} else {
			return 0;
		}
}
function validateRealName2(obj){
   var str = obj.value;
   //alert(obj.value);
	// str length
	// include chinese or letter
	var patn = /^([\u4e00-\u9fa5])+$/;    
    if(str.len()<4 || str.len()>8) {
    		return 1;
    	}
		else if (!patn.test(str)) {
				return 2;
		} else {
			return 0;
		}
}
/*檢查身份證*/
function validateCardCode(obj){
    var str = obj.value;
    var patn = /^(\d{18}|\d{17}[xX]|\d{15})$/;
    if(!patn.test(str)){
        return 1;
    }  

    var y,m,d,r,f
    if (str.length==15)
    {
        y = str.substr(6,2);
        m = str.substr(8,2);
            if(m>12 || m<1){
                return 2;
            }
        d = str.substr(10,2);
            if(d<1 || d>31){
                 return 0;
            }
        try
        {
            y = 1900 + parseInt(y);
        }
        catch(e)
        {}
    } else if (str.length==18) {
        y = str.substr(6,4);
        m = str.substr(10,2);
        
        if(m>12 || m<1){
            return 2;
        }
        d = str.substr(12,2);
        if(d<1 || d>31){
            return 2;
        }
    }
	else
	{
		return 0;
	}
    r = new Date(parseInt(y)+parseInt(18),parseInt(m)-1,d);
    f = new Date();
    if(r>f)
    {
        return 1;
    }
    else
    {
        return 0;
    }
    return 0;
}

function validateCheckCode(obj){
//	var str = obj.value;
//	var patn = /^[0-9a-zA-Z]{4}$/;
//        if(patn.test(str)) return 0;
//	return 1;
    return 0;
}

function validatePassword(obj){
	//var str = obj.value;
	//var patn = /^[0-9a-zA-Z]\w{4,13}[0-9a-zA-Z]$/;
	//alert(obj.value.length);
	if(obj.value.length<6 || obj.value.length>20) return 1;
	return 0;
}



function validateSafePassword(obj){
	var str = obj.value;
	//check length and alphabet
	if(validatePassword(obj)>0) return 1;
	//check if same as username
	//(str == document.getElementById("username").value) return 2;
	
	//check if all the characters are the same
	for(var i=0;i<str.length;i++){
		if(str.charAt(0)!=str.charAt(i)) break;
	}
	if(i == str.length) return 3;
	//check if is number sequence
	var seqStr="01234567890";
	if(seqStr.indexOf(str) != -1) return 4;
	//check if is lower alphabet sequence
	var seqStr="abcdefghijklmnopqrstuvwxyz";
	if(seqStr.indexOf(str) != -1) return 5;
	//check if is upper alphabet sequence
	var seqStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	if(seqStr.indexOf(str) != -1) return 6;

	//if validated
	return 0;
}

 

function validateEmail(obj){
	var str = obj.value;
	var patn = /^[_a-zA-Z0-9\-]+(\.[_a-zA-Z0-9\-]*)*@[a-zA-Z0-9\-]+([\.][a-zA-Z0-9\-]+)+$/;
	//var patn = /^[^\d\-_][\w\-]*[^\-_]@[^\-][a-zA-Z\d\-]*[^\-](\.[^\-][a-zA-Z\d\-]*[^\-])*\.[a-zA-Z]{3}(\.[a-zA-Z]{2})?$/;
	if(patn.test(str)){
		return 0;
	}else{
		return 1; //incorrect format
	}
}

/**
* 檢查電子郵件 add by huanghuajun 0712
*/
function validateEmailNew(obj){
	var str = obj.value;
	var patn = /^[_a-zA-Z0-9\-]+(\.[_a-zA-Z0-9\-]*)*$/;
	if(patn.test(str)){
		return 0;
	}else{
		return 1; //incorrect format
	}
}

function validateNum(obj){
	var str = obj.value;
	var patn = new RegExp("\\d{"+getAttrValueByName(obj,"minlen")+","+getAttrValueByName(obj,"maxlen")+"}");
	if(patn.test(str)) return 0;
	return 1;
}

function validateMobile(obj){
	var str = obj.value;
	var patn = /^(13|15)\d{9}$/;
	if(patn.test(str)) return 0;
	return 1;
}

function validateMirror(obj){
	if(validateSameAs(obj)){
		var sameobj = document.getElementById(getAttrValueByName(obj,"sameas"));
		var sameobj_dt;
		if(eval(sameobj.id).d) sameobj_dt=eval(sameobj.id).d;
		else return -1;
		if(sameobj_dt != "mirror"){ //avoid a mirror type filed being another mirror type filed's mirror
			if(validateValue(sameobj) == 0)	 return 0;
			else return 2;
		}
	}
	return 1;
}
function validateSameAs(obj){
	var v1,v2;
	if(!getAttrValueByName(obj,"sameas")) return true;
	v1=obj.value;
	v2=document.getElementById(getAttrValueByName(obj,"sameas")).value;
	if(v1 == v2) return true;
	return false;
}
function checkByteLength(str,minlen,maxlen) {
	if (str == null) return false;
	var l = str.length;
	var blen = 0;
	for(i=0; i<l; i++) {
		if ((str.charCodeAt(i) & 0xff00) != 0) {
			blen ++;
		}
		blen ++;
	}
	if (blen > maxlen || blen < minlen) {
		return false;
	}
	return true;
}

function changeNick() {
	var newNick = window.prompt("請輸入用戶名:", document.getElementById("username").value);
	if (newNick != null && newNick != "" && newNick != "undefined") {
		document.getElementById("username").value = newNick;
		document.getElementById("shownickname").innerHTML = newNick;
	}
}

function checkSafePassword(passwd) {
	var str = passwd;
	var patn = /^[\x00-\xff]{6,20}$/;
	if(!patn.test(str)) return 1;
	if (str == document.getElementById("username").value) {
	    return 2;
}
	for (var i=0;i<str.length;i++){
		    if(str.charAt(0)!=str.charAt(i))
		    break;
	}
	if(i == str.length) return 3;

	var seqStr="01234567890";
	if(seqStr.indexOf(str) != -1) return 4;

	var seqStr="abcdefghijklmnopqrstuvwxyz";
	if(seqStr.indexOf(str) != -1) return 5;

	var seqStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	if(seqStr.indexOf(str) != -1) return 6;
	return 0;
}

	// Function Name: len
	// Function Description: 返回字符串的實際長度, 一個漢字算2個長度
	// Creation Date: 2004-7-13 9:58
	// Last Modify By: N/A
	// Last Modify Date: N/A
	String.prototype.len=function()
	{
		var str=this;
		return str.replace(/[^\x00-\xff]/g, "**").length
	}
	
	function validateRealName(obj){
		var str = obj.value;
		// str length
		// include chinese or letter
		var patn = /^([\u4e00-\u9fa5]|[A-Za-z])+$/;    
    if(str.len()<4 || str.len()>20) {
    		return 1;
    	}
		else if (!patn.test(str)) {
				return 2;
		} else {
			return 0;
		}
	}

function validateSsn(obj){
		var str = obj.value;
		var patn = /^(\d{18}|\d{17}[xX]|\d{15})$/;
		if(patn.test(str)) return 0;
		return 1;
}

function validateSafecode(obj){
		var str = obj.value;
		var patn = /^\d{4}$/;
		if(!patn.test(str)) return 1;
		//check if all the characters are the same
		for(var i=0;i<str.length;i++){
			if(str.charAt(0)!=str.charAt(i)) break;
		}
		if(i == str.length) return 2;
		//check if is number sequence
		var seqStr="01234567890";
		if(seqStr.indexOf(str) != -1) return 3;
		// true
		return 0;
}

function validatSendcode(obj){
		var str = obj.value;
		var patn = /^\d{6}$/;
		if(!patn.test(str)) return 1;
		return 0;
}

function validateRule(obj){
		if(obj.checked) return 0;
		return 1;
}

	function tr_display(type){
		if(type == 'email'){
			emails.style.display = 'block';
			mobiles.style.display = 'none';
		}
		if(type == 'mobile'){
		emails.style.display = 'none';
		mobiles.style.display = 'block';
		}
	}

/**
 * 客戶端檢查非法字符, 不得含有 ""
 * @param p_String 待檢查的字符串
 * @return 合法字符串返回 true, 否則返回 false
 */
function validateNickname(obj){
	var str = obj.value;
	var patn = /[\\{}\'\[\]\"|<>#$%^&`~]/;
	if(str.len()<4 || str.len()>16) {
    	return 1;
  }	
	if(patn.test(str)) return 2;
	return 0;
}

function validateQuestion(obj){
	var str = obj.value;
	var patn = /[\\{}\'\[\]\"|<>#$%^&`~]/;
	if(str.len()<4 || str.len()>20) {
    	return 1;
  }	
	if(patn.test(str)) return 2;
	return 0;
}

function validateAnswer(obj){
	var str = obj.value;
	var patn = /[\\{}\'\[\]\"|<>#$%^&`~]/;
	if(str.len()<4 || str.len()>20) {
    	return 1;
  }	
	if(patn.test(str)) return 2;
	return 0;
}

	var validatedInfo		= "<img src='images/standard_msg_ok.gif'>&nbsp;填寫正確。";
	var selectedInfo		= "<img src='images/standard_msg_ok.gif'>&nbsp;選擇正確。";
	var requireErrorInfo	= "此項為必填項。<br \/>";


