/**
 * 新表单验证
 */
var validStrategy = {
    empty: function (value, msg) {
        console.log("value empty" + value);
        console.log(value === "");
        if (value === "") {
            return msg;
        }
    },
    //长度
    length: function (value, length, msg) {
        if (value.length < length) {
            return msg;
        }
    },
    //数字
    digital: function (value, msg) {

        if (/[^\d+]/.test(value)) {
            return msg;
        }
    },
    //字母数字
    word: function (value, msg) {

        if (/\d+/.test(value)) {
            return msg;
        }
    },
    //电话号码
    phoneNumber: function (value, msg) {
        var regExp = /^(13[0-9]{9})|(15[89][0-9]{8})$/;
        if (!regExp.test(value)) {
            return msg;
        }
    },
    nuberString:function(value,msg){
        var regExp=/[^\d\-]/;
        if (regExp.test(value)) {
            return msg;
        }
    },
    email: function (value, msg) {
        var regExp = /^([a-z0-9]*[-_]?[a-z0-9]+)*@([a-z0-9]*[-_]?[a-z0-9]+)+[\.][a-z]{2,3}([\.][a-z]{2})?$/i;
        if (!regExp.test(value)) {
            return msg;
        }
    }
};

/**
 * 验证器构造函数
 * */
var validator = function () {
    this.cache = [];
    this.shower = null;
    this.strategyObj = null;
};

//添加验证规则
//strategyObj->策略对象,value->验证值, rules->验证规则对象数组[{},{},{}]
validator.prototype.add = function (value, rules) {
    var _self = this;
    for (var j = 0, lenj = rules.length; j < lenj; j++) {
        var rule = rules[j];
        var _self = this;

        //匿名函数创建的闭包结构保证遍历rule时之前的规则不会改变
        (function (rule) {
            var strategyArr = rule.strategy.split(":");
            var strategy = strategyArr.shift(); //取出当前验证项的策略参数

            //动态构建参数数组 call方法无法实现动态构建参数，此处用apply方法
            strategyArr.push(rule.errorMsg);  //push当前验证项的错误信息
            strategyArr.unshift(value);        //unshift操作 如果中间有长度参数 则作为数组的第二个参数传入函数apply
            _self.cache.push(function () {
                return _self.strategyObj[strategy].apply(_self.strategyObj, strategyArr);
            });
        })(rule);
    }

};
//启动所有添加的验证
validator.prototype.start = function () {

    for (var i = 0, len = this.cache.length; i < len; i++) {
        var fn = this.cache[i];
        var msg = fn();
        // console.log("msg:" + typeof msg + msg);
        if (msg) {//错误情况 return 用于外部判断是否通过
            this.showMessage(msg);
            return msg;
        }
    }
    this.showMessage(msg); //验证全部日通过；
};
//设置验证信息显示element
validator.prototype.setShower = function (shower) {
    this.shower = shower;
};
//显示验证信息方法
validator.prototype.showMessage = function (msg) {
    this.clearValidMessage(); //清除之前可能存在的验证信息
    if (msg) {
        //显示错误信息
        this.showErrorMessage(msg);
    } else {
        // 如果需要显示正确信息
        this.showRightMessage(msg);
    }
};
//清除验证显示
validator.prototype.clearMessage = function () {
    this.clearValidMessage();
};
//初始化设置验证
validator.prototype.init = function (obj) {
    if (typeof obj.showErrorMessage == "function") {
        this.showErrorMessage = obj.showErrorMessage;
    }
    if (typeof obj.showErrorMessage == "function") {
        this.showRightMessage = obj.showRightMessage;
    }
    if (typeof obj.clearValidMessage == "function") {
        this.clearValidMessage = obj.clearValidMessage;
    }
    if (typeof obj.strategyObj == "object") {
        this.strategyObj = obj.strategyObj;
    }
}



/*
*使用示例

 var ipt1 = document.getElementById("ipt1");
 var validInput = new validator();
 validInput.init({
//显示错误信息的方法
 showErrorMessage: function (msg) {
 ipt1.style.backgroundColor = "red";
 alert(msg);
 },
 //显示正确信息的方法
 showRightMessage: function () {
 ipt1.style.backgroundColor = "green";
 },
 //清除错误提示的方法
 clearValidMessage: function () {
 ipt1.style.backgroundColor = "red";
 },
 //验证策略对象
 strategyObj: validStrategy
 });

 //设置需要验证的内容
 validInput.add(ipt1.value,
 [
 {
 strategy: "empty",
 errorMsg: "输入内容不能为空"
 },
 {
 strategy: "digital",
 errorMsg: "需要输入数字内容"
 }
 ]);

//启动验证
 var isPass=validInput.start();

*/