﻿/*
    基于jquery，功能简单
    验证方法，订单确认页面需要使用
*/


(function($){
    var PROP_NAME = 'xValidator';

    var xValidator = function() {
        this._div = "<div class='pswords'>{0}</div>";        
    };
    
    $.extend( xValidator.prototype, {
        _validateArr : {},
        _newInst:function( target, options, fi){
            var id = target[0].id.replace(/([:\[\]\.])/g, '\\\\$1');
            return {id:id, input:target, options:options||null,fn: fi || null};
        },
        _getInst:function(target){
            return $.data(target,PROP_NAME);
        },
        _validateList:{},
        _refresh:false,
        _inst:null,//current instance     
        /*方法验证*/   
        _addValidator : function(name,options,fi){
            this._validateArr[name] = {options:options||null,fn:fi||null};
        },
        /*开始验证*/
        _beginValidate : function(name){
            var inst = this._validateArr[name],options = inst.options,length =!inst.options ? 0 : inst.options.length,fn = inst.fn,i=0,jerr=0;
            
            for ( var value,i=0;i < length,value =options[i]; i++){
                
                /*初始化参数*/
                if(!value.extended)
                {
                    value.input = $("#" + value.id);/*保存$(HTMLElement)*/                    
                    value.div = null;/*是否已添加提示层*/
                    value.err = false;/*是否验证出错*/       
                    value.extended = true;/*是否已初始化*/          
                }
              
                var ret = (!value.validate?($.xValidator._validateList[value.type].apply(this,[value.input.val()].concat(value.args?value.args:[]))) : (value.validate.call( value, value.input.val() ) !== false));
                
                if(!ret){                    
                    value.err = true;  
                    jerr++;
                } else {
                    value.err = false;
                }
            }
            
            this._showErrInList(name);       
            
            if( jerr > 0 )
            {                   
                return false;                   
            }
            else
            {
                if(!!fn){
                   return fn();
                }
                
                return true;
            } 
        },
        /*显示提示信息*/
        _showErrInList : function(name){
            var _this = this;
            this._validateArr[name].options.each(function(i,a){
                if(a.err){
                    if(!!a.showmsgfunc){
                        a.showmsgfunc.call(a);
                        return;
                    }
                    if(!a.div){
                        a.div = $(_this._div.template(a.message));
                        a.div.insertAfter(a.input);
                    } else {
                        a.div.show()
                    }
                }
                if(!a.err){
                    if(!!a.hidemsgfunc){
                        a.hidemsgfunc.call(a);
                        return;
                    }
                    if(a.div)
                        a.div.hide();
                }
            });
        },
        /*清除提示信息*/
        _clearErr : function(name){
            var _this = this;
            this._validateArr[name].options.each(function(i,a){    
                    if(a.div)
                        a.div.hide();
            });
        }
    });   
    
    $.xValidator = new xValidator();//singleton instance
    $.xValidator.initialized = false;
        
    /*
        validation list
    */
    $.xValidator._validateList.number=function(a)
        {
            var pattern = /^\d+$/;
            var f = pattern.test(a);
            if(f)
            {
                return true;
            }
            else
                return false;
        };
    $.xValidator._validateList.required=function(a)
        {
            if(a!="")
            {
                return true;
            }
            else
                return false;
        };
    $.xValidator._validateList.checkByteLength = function(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;
        };
    $.xValidator._validateList.email = function(a){
            var _this =this;
    	    var str = a;
    	    if(!$.xValidator._validateList.checkByteLength(str,1,50)) return false;
      	    var patn = /^[_a-zA-Z0-9\-]+(\.[_a-zA-Z0-9\-]*)*@[a-zA-Z0-9\-]+([\.][a-zA-Z0-9\-]+)+$/;
    	    if(!patn.test(str)){
        	    return false;//incorrect format
    	    }
		    return true;
		};
	$.xValidator._validateList.checkZip = function(a){
	        pass = false;
            if(checkNum(a)){
                if(a.length==6){
                    pass = true;
                }
            }
            return pass;
	};
	$.xValidator._validateList.checkTel = function(a){
	        pass = false;
   
            if(checkTel(a)){
                if( a.length > 6 && a.length <= 15){
                    pass=true;
                }
            }
            return pass;
	};
	$.xValidator._validateList.checkAddress = function(a){
	        pass = false;  

            if(checkAddress(a)){
                if(a.length > 0){
                    pass = true;
                }
            }
            return pass;
	};
})(jQuery);
