﻿//************************//
//Author 		: ldc
//Date			: 2008-04-25
//LastModify    : 2008-04-25
//E-Mail		: ldc003@163.com
function $(o){
	return document.getElementById(o);
}
function getA(o,name){
	return o.getAttribute(name);
}
String.prototype.inc = function(s){
	if(this.indexOf(s)!=-1)
		return true;
	return false;
}

function Validator(){
    me = this,
	this.errMsg = null,
	this.form = null,
	this.setCheck = function(form) {
	    me.form = document.forms[form];
	    var os = me.form.elements;
	    var o = null;
	    for (var i = 0; i < os.length; i++) {
	        o = os[i];
	        if (getA(o, "chkRule")) {
	            o.onblur = me.setblur;
	            o.onfocus = me.setfocus;
	        }
	    }
	},
	this.setblur = function() {
	    if (me.check(this, false)) {
	        this.className = "";
	        if ($(this.id + "_span")) {
	            $(this.id + "_span").className = "chkok";
	            $(this.id + "_span").innerHTML = "OK！";
	        }
	    }
	},
	this.setfocus = function() {
	    this.className = "focus";
	    if ($(this.id + "_span")) {
	        $(this.id + "_span").className = "chknormal";
	        $(this.id + "_span").innerHTML = getA(this, "baktext");
	    }
	},
	this.check = function(o, chkall) {
	    var rule = getA(o, "chkRule");
	    var result = /\/([0-9]{1,8})-([0-9]{1,8})\//.exec(rule);
	    if (rule.inc("/null/")) {
	        if (o.value == "") {
	            o.className = "waring";
	            if ($(o.id + "_span")) {
	                $(o.id + "_span").className = "chkwaring";
	                $(o.id + "_span").innerHTML = getA(o, "tname") + "不能為空！";
	            }
	            if (chkall == true) {
	                this.errMsg.push(getA(o, "tname") + "不能為空！");
	            }
	            return false;
	        }
	    }
	    if (rule.inc("/^a/")) {
	        if (!(/^[a-zA-Z]{1}$/.test(o.value.substring(0, 1)))) {
	            o.className = "waring";
	            if ($(o.id + "_span")) {
	                $(o.id + "_span").className = "chkwaring";
	                $(o.id + "_span").innerHTML = getA(o, "tname") + "第一個字元必須是字母！";
	            }
	            if (chkall == true) {
	                this.errMsg.push(getA(o, "tname") + "第一個字元必須是字母！");
	            }
	            return false;
	        }
	    }
	    if (result) {
	        var nmin = result[1];
	        var nmax = result[2];
	        if (o.value.length < nmin || o.value.length > nmax) {
	            o.className = "waring";
	            if ($(o.id + "_span")) {
	                $(o.id + "_span").className = "chkwaring";
	                $(o.id + "_span").innerHTML = getA(o, "tname") + "長度必須是" + nmin + "-" + nmax + "個字元！";
	            }
	            if (chkall == true) {
	                this.errMsg.push(getA(o, "tname") + "長度必須是" + nmin + "-" + nmax + "個字元！");
	            }
	            return false;
	        }
	    }
	    if (rule.inc("/compare/")) {
	        var cop = $(getA(o, "compareto"));
	        if (o.value != cop.value) {
	            o.className = "waring";
	            if ($(o.id + "_span")) {
	                $(o.id + "_span").className = "chkwaring";
	                $(o.id + "_span").innerHTML = getA(o, "tname") + "與" + getA(cop, "tname") + "輸入的不一致！";
	            }
	            if (chkall == true) {
	                this.errMsg.push(getA(o, "tname") + "與" + getA(cop, "tname") + "輸入的不一致！");
	            }
	            return false;
	        }
	    }
	    if (rule.inc("/mail/")) {
	        if (!(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/.test(o.value))) {
	            o.className = "waring";
	            if ($(o.id + "_span")) {
	                $(o.id + "_span").className = "chkwaring";
	                $(o.id + "_span").innerHTML = getA(o, "tname") + "格式有誤！";
	            }
	            if (chkall == true) {
	                this.errMsg.push(getA(o, "tname") + "格式有誤！");
	            }
	            return false;
	        }
	    }
	    if (rule.inc("/date/")) {

	        if (!(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/.test(o.value)) && !(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/.test(o.value))) {
	            o.className = "waring";
	            if ($(o.id + "_span")) {
	                $(o.id + "_span").className = "chkwaring";
	                $(o.id + "_span").innerHTML = getA(o, "tname") + "格式有誤！";
	            }
	            if (chkall == true) {
	                this.errMsg.push(getA(o, "tname") + "格式有誤！");
	            }
	            return false;
	        }
	    }
	    if (rule.inc("/num/")) {
	        if (!(/^[0-9]{1,8}$/.test(o.value))) {
	            o.className = "waring";
	            if ($(o.id + "_span")) {
	                $(o.id + "_span").className = "chkwaring";
	                $(o.id + "_span").innerHTML = getA(o, "tname") + "只能為數字！";
	            }
	            if (chkall == true) {
	                this.errMsg.push(getA(o, "tname") + "只能為數字！");
	            }
	            return false;
	        }
	    }
	    if (rule.inc("/abc/")) {
	        if (!(/^[a-zA-Z]+$/.test(o.value))) {
	            o.className = "waring";
	            if ($(o.id + "_span")) {
	                $(o.id + "_span").className = "chkwaring";
	                $(o.id + "_span").innerHTML = getA(o, "tname") + "只能為英文字母！";
	            }
	            if (chkall == true) {
	                this.errMsg.push(getA(o, "tname") + "只能為英文字母！");
	            }
	            return false;
	        }
	    }
	    if (rule.inc("/abc1/")) {
	        if (!(/^[a-zA-Z0-9]+$/.test(o.value))) {
	            o.className = "waring";
	            if ($(o.id + "_span")) {
	                $(o.id + "_span").className = "chkwaring";
	                $(o.id + "_span").innerHTML = getA(o, "tname") + "只能為英文或者數字！";
	            }
	            if (chkall == true) {
	                this.errMsg.push(getA(o, "tname") + "只能為英文或者數字！");
	            }
	            return false;
	        }
	    }
	    if (rule.inc("/exist/")) {
	        if (chkall == false) {
	            $(o.id + "_span").className = "chknormal";
	            $(o.id + "_span").innerHTML = "正在驗證是否可用..";
	            var callback = getA(o, "fn");
	            try {
	                eval("var fn = " + callback);
	                fn(o.value, function(res) {
	                    if (res.value == 1) {
	                        $(o.id + "_span").className = "chkok";
	                        $(o.id + "_span").innerHTML = "該" + getA(o, "tname") + "可以註冊！";
	                    } else {
	                        $(o.id + "_span").className = "chkwaring";
	                        $(o.id + "_span").innerHTML = getA(o, "tname") + " " + o.value + " 已經被註冊！";
	                    }
	                }); return;
	            } catch (e) { alert(e) };
	        }
	    }
	    if (rule.inc("/comid/")) {
	        var tmp = new String("12121241");
	        var sum = 0;
	        re = /^\d{8}$/;
	        if (!re.test(o.value)) {
	            //alert("格式不對！");
	            chkall = true;
	        }
	        for (i = 0; i < 8; i++) {
	            s1 = parseInt(o.value.substr(i, 1));
	            s2 = parseInt(tmp.substr(i, 1));
	            sum += cal(s1 * s2);
	        }
	        if (!valid(sum)) {
	            if (o.value.substr(6, 1) == "7") return (valid(sum + 1));
	        }
	        chkall = !valid(sum);
	        if (chkall == true) {
	            o.className = "waring";
	            if ($(o.id + "_span")) {
	                $(o.id + "_span").className = "chkwaring";
	                $(o.id + "_span").innerHTML = getA(o, "tname") + "格式有誤！";
	            }
	            if (chkall == true) {
	                this.errMsg.push(getA(o, "tname") + "格式有誤！");
	            }
	            return false;
	        }
	    }
	    return true;
	},
	this.checkall = function() {
	    me.errMsg = new Array();
	    var os = me.form.elements;
	    var o = null;
	    for (var i = 0; i < os.length; i++) {
	        o = os[i];
	        if (getA(o, "chkRule")) {
	            me.check(o, true);
	        }
	    }
	    var msg = "";
	    if (me.errMsg.length > 0) {
	        for (var i = 0; i < me.errMsg.length; i++) {
	            if (i > 0) {
	                msg += "\n";
	            }
	            msg += "- " + me.errMsg[i];
	        }
	        alert(msg);
	        return false;
	    }
	    return true;
	}
}

function valid(n) {
    return (n % 10 == 0) ? true : false;
}



function cal(n) {
    var sum = 0;
    while (n != 0) {
        sum += (n % 10);
        n = (n - n % 10) / 10;  // 取整數
    }
    return sum;
}
