﻿Validator = {
    /*验证类型*/
    phone: /^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?(([1-9]\d{6,7})|(1[358]\d{9}))(\-\d{1,4})?$/,
    mobile: /^((\(\d{3}\))|(\d{3}\-))?1[358]\d{9}$/,
    url: /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/,
    currency: /^\d+(\.\d+)?$/,
    number: /^\d+$/,
    zip: /^[1-9]\d{5}$/,
    qq: /^[1-9]\d{4,9}$/,
    integer: /^[-\+]?\d+$/,
    double: /^[-\+]?\d+(\.\d+)?$/,
    english: /^[A-Za-z]+$/,
    chinese: /^[\u0391-\uFFE5]+$/,
    username: /^[a-z]\w{3,}$/i,
    unsafe: /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/,
    domainname: /^[a-z0-9]+[a-z0-9\-]*[a-z0-9]+$/i,

    require: "value.trim()!=''",
    email: "value.isEmail()",
    idcard: "value.isIdCard()",
    safestring: "this.IsSafe(value)",
    filter: "this.DoFilter(value, getAttribute('accept'))",
    limit: "this.Limit(value.length,getAttribute('min'), getAttribute('max'))",
    limitb: "this.Limit(value.lenB(), getAttribute('min'), getAttribute('max'))",
    date: "value.isDate(getAttribute('format'))",
    repeat: "value == document.getElementsByName(getAttribute('to'))[0].value",
    range: "getAttribute('min') < (value|0) && (value|0) < getAttribute('max')",
    compare: "this.Compare(value,getAttribute('operator'),getAttribute('to'))",
    custom: "value.test(getAttribute('regexp'),'g')",
    radiolist: "this.CheckRadioList(this.validateControls[i])",
    checkboxlist: "this.CheckCheckboxList(this.validateControls[i])",
    selectlist: "this.CheckSelectList(this.validateControls[i])",
    select: "selectedIndex >= getAttribute('min')",

    ErrorItem: [],
    ErrorMessage: [],
    validateControls: [],
    validate: function(mode, groupName) {
        this.validateControls.length = 0;
        this.ErrorItem.length = 0;
        this.ErrorMessage.length = 0;
        if(arguments.length<2) groupName = "";
        groupName = groupName.toString().toLowerCase();
        var eles = document.getElementsByTagName("*");
        for (var i = 0; i < eles.length; i++) {
            var tag = eles[i].tagName.toUpperCase();
            var vgroup = "";
            if (tag == "INPUT" || tag == "SELECT" || tag == "TEXTAREA" || eles[i].getAttribute("v") != null) {
                vgroup = eles[i].getAttribute("vgroup") || "";
                if (vgroup.toLowerCase() == groupName) { this.validateControls[this.validateControls.length] = eles[i]; }
            }
        }
        var count = this.validateControls.length;
        for (var i = 0; i < count; i++) {
            with (this.validateControls[i]) {
                var _dataType = getAttribute("vtype");
                if (_dataType != null) _dataType = _dataType.toLowerCase();
                if (typeof (_dataType) == "object" || typeof (this[_dataType]) == "undefined") continue;
                this.ClearState(this.validateControls[i]);

                if (getAttribute("require") == "false" && value == "") continue;
                if (typeof this[_dataType] == "string") {
                    if (!eval(this[_dataType])) {
                        this.AddError(i, getAttribute("msg") == null ? "" : getAttribute("msg"));
                    }
                } else if (typeof this[_dataType] == "object") {
                    if (!this[_dataType].test(value)) {
                        this.AddError(i, getAttribute("msg") == null ? "" : getAttribute("msg"));
                    }
                }
            }
        }
        if (this.ErrorMessage.length > 0) {
            mode = mode || 1;
            var errCount = this.ErrorItem.length;
            switch (mode) {
                case 2:
                    for (var i = 0; i < errCount; i++) {
                        this.ErrorItem[i].style.color = "red";
                    }
                case 1:
                    alert(this.ErrorMessage.join("\n"));
                    this.ErrorItem[0].focus();
                    break;
                case 3:
                    for (var i = 0; i < errCount; i++) {
                        try {
                            var span = document.createElement("SPAN");
                            span.id = "__ErrorMessagePanel";
                            span.style.color = "red";
                            this.ErrorItem[i].parentNode.appendChild(span);
                            span.innerHTML = this.ErrorMessage[i].replace(/\d+:/, "*");
                        }
                        catch (e) { alert(e.description); }
                    }
                    this.ErrorItem[0].focus();
                    break;
                default:
                    alert(this.ErrorMessage.join("\n"));
                    break;
            }
            return false;
        }
        return true;
    },
    IsSafe: function(str) {
        return !this.unsafe.test(str);
    },
    Limit: function(len, min, max) {
        min = min || 0;
        max = max || Number.MAX_VALUE;
        return min <= len && len <= max;
    },
    ClearState: function(elem) {
        with (elem) {
            if (style.color == "red") {
                style.color = "";
            }
            var lastNode = parentNode.childNodes[parentNode.childNodes.length - 1];
            if (lastNode.id == "__ErrorMessagePanel")
                parentNode.removeChild(lastNode);
        }
    },
    AddError: function(index, str) {
        this.ErrorItem[this.ErrorItem.length] = this.validateControls[index];
        this.ErrorMessage[this.ErrorMessage.length] = (this.ErrorMessage.length + 1).toString() + ":" + str;
    },
    Compare: function(op1, operator, op2) {
        switch (operator) {
            case "!=":
                return (op1 != op2);
            case ">":
                return (op1 > op2);
            case ">=":
                return (op1 >= op2);
            case "<":
                return (op1 < op2);
            case "<=":
                return (op1 <= op2);
            default:
                return (op1 == op2);
        }
    },
    DoFilter: function(input, filter) {
        return new RegExp("^.+\.(?=EXT)(EXT)$".replace(/EXT/g, filter.split(/\s*,\s*/).join("|")), "gi").test(input);
    },
    CheckSelectList: function(from) {
        var eles = from.getElementsByTagName("SELECT");
        var vlen = from.getAttribute("min");
        vlen = isNaN(vlen) ? eles.length : vlen;
        for (var i = 0; i < vlen; i++) {
            if (eles[i] == null || eles[i] == null || eles[i].style.display == "none") return true;
            if (eles[i].selectedIndex < 1) return false;
        }
        return true;
    },
    CheckCheckboxList: function(from) {
        var eles = from.getElementsByTagName("INPUT");
        var min = from.getAttribute("min");
        var max = from.getAttribute("max");
        min = isNaN(min) ? 0 : min;
        max = isNaN(max) ? eles.length : max;
        var cnt = 0;
        for (var i = 0; i < eles.length; i++) {
            if (eles[i].getAttribute("type").toLowerCase() == "checkbox") {
                cnt += eles[i].checked ? 1 : 0;
            }
        }
        return cnt >= min && cnt <= max;
    },
    CheckRadioList: function(from) {
        var eles = from.getElementsByTagName("INPUT");
        for (var i = 0; i < eles.length; i++) {
            if (eles[i].getAttribute("type").toLowerCase() == "radio" && eles[i].checked) {
                return true;
            }
        }
        return false;
    }
};
