﻿K2046.Validator = {//用于验证表单的类.
    Attach: function(rule, form) {//将验证规则附加到表单的onsubmit事件.rule:指定的验证规则;form:指定的form.
        form = K2046.$(form);
        var me = this;
        K2046.Events.Attach(form, "onsubmit", function() {
            return me.Validate(rule, form);
        });

        //        var me = this;
        //        form.onsubmit = function(o) {
        //            return function() {
        //                return o.Validate(rule, form);
        //            };
        //        } (this);
    }

    //从服务端取得指定实体的验证规则的Xml配置,并转换为js可用的验证规则.
    //该方法需要发起异步请求,所以需要先加载Ajax.js.
    //参数:
    //      entity      : 实体名称,即对应的Xml文档名称.
    //      callback    : 取得验证规则后的回调方法.
    //callback可接收到的参数
    //      entity      : 实体名称
    //      rules       : 取得的验证规则
    //      success     : 是否成功取得规则.
    , LoadRules: function(entity, callback) {
        var Rules = [];
        K2046.Ajax.Request({
            url: "/Xml/Validate/" + entity + ".Xml?" + K2046.Guid.NewGuid(),
            method: 'get',
            callback: function(text, xml) {
                if (xml) {
                    var Elements = xml.getElementsByTagName("K");
                    if (Elements.length) {
                        for (var x = 0; x < Elements.length; x++) {
                            var l = Elements[x].getAttribute("Location");
                            if (!l || l == "1") {
                                continue;
                            }
                            var handler = Elements[x].getAttribute("handler");
                            handler = handler ? new Function("value", handler) : null;
                            var dt = Elements[x].getAttribute("DataType");
                            dt = dt ? eval("/" + dt + "/") : null;
                            Rules.push({
                                id: Elements[x].getAttribute("SN"),
                                Label: Elements[x].getAttribute("Label"),
                                Default: Elements[x].getAttribute("Default"),
                                AllowEmpty: eval(Elements[x].getAttribute("AllowEmpty")),
                                DataType: dt,
                                MinLength: Elements[x].getAttribute("MinLength"),
                                MaxLength: Elements[x].getAttribute("MaxLength"),
                                handler: handler,
                                EmptyMsg: Elements[x].getAttribute("EmptyMsg"),
                                MinLengthMsg: Elements[x].getAttribute("MinLengthMsg"),
                                MaxLengthMsg: Elements[x].getAttribute("MaxLengthMsg"),
                                TypeMsg: Elements[x].getAttribute("TypeMsg")
                            });
                        }
                    }
                    callback(entity, Rules, true);
                } else {
                    callback(entity, Rules, false);
                }
            }
        });
    }

    , ValueType: {//数据类型枚举(用于验证数据格式的正则表达式).
        Integer: /^\d+$/,
        Email: /^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
        Chinese: /^[\u0391-\uFFE5]+$/,
        Letter: /^[a-zA-Z]+$/
    }

    , Validate: function(rule, form) {//执行验证.
        /*
        rule : 指定的验证规则
        form : 要验证的表单
        */
        for (var x = 0; x < rule.length; x++) {//遍历验证规则
            var v = K2046.$(rule[x].id).value.trim(); //取得指定的dom的值,并去除首尾空白字符.
            if (rule[x].handler && typeof (rule[x].handler) == "function") {//检查是否有自定义验证方法.
                var r = rule[x].handler(v);
                if (r == false) {
                    return false;
                }
                else if (r == "continue") {
                    continue;
                }
            }

            if (rule[x].AllowEmpty == false && (v == "" || v == rule[x].Default)) {//验证规则是否允许为空,如果值等于默认值也视为空值.
                alert(rule[x].EmptyMsg ? rule[x].EmptyMsg : (rule[x].Label + '不能为空.'));
                return false;
            }

            if (v == rule[x].Default) {
                K2046.$(rule[x].id).value = "";
            }
            if (v == "" && rule[x].AllowEmpty) {
                return true;
            }
            if (rule[x].AllowEmpty == false && rule[x].MinLength && v.length < rule[x].MinLength) {//验证是否限制最小长度.
                alert(rule[x].MinLengthMsg ? rule[x].MinLengthMsg : (rule[x].Label + '最少需要' + rule[x].MinLength + '个字符.'));
                return false;
            }

            if (rule[x].MaxLength && rule[x].MaxLength > 0 && v.length > rule[x].MaxLength) {//验证是否限制最大长度.
                alert(rule[x].MaxLengthMsg ? rule[x].MaxLengthMsg : (rule[x].Label + '最多允许使用' + rule[x].MaxLength + '个字符.'));
                return false;
            }

            if (rule[x].DataType && !rule[x].DataType.test(v)) {//验证数据格式.
                alert(rule[x].TypeMsg ? rule[x].TypeMsg : (rule[x].Label + '格式不正确.'));
                return false;
            }
        }
        return true;
    }
    //      , SampleRule: [//验证规则完全示例.
    //            {id: 'UserName', Label: '用户名', Default: 'name', AllowEmpty: false, DataType: K2046.Validator.ValueType.Email, Length: 32, EmptyMsg: '用户名不能为空.', TypeMsg: '用户名格式不正确.', LengthMsg: '用户名最多允许使用32个字符.', handler: function(v) { if (v == "admin") { alert('不允许使用该用户名.'); return false; } return true; } }
    //        ]
};