﻿/*
基于jQuery的表单验证插件
*/

//所有input select textarea 都有效果
/*
$(document).ready(function(){
	$("input,select,textarea").focus(function(){
		$(this).css("background-color","#FFFFD7");
		//alert("aa");
	});
	$("input,select,textarea").blur(function(){
		$(this).css("background-color","#ffffff");
		//alert("aa");
	});	
});

function validatorBox(type,obj,msg){
	return false;
	if(type=="hide"){
		$("#validatorBox").hide(); 
		return;
	}
	var obj = jQuery(obj);
    var offset = obj.offset();
	var _left = offset.left+obj.width()+8;
	var _top = offset.top-10;
	
	if (!$("#validatorBox")[0]){//如果没有对象,create it!
		var tmp= "<div id=\"validatorBox\" class=\"tips_blue\" style=\"hidden\">";
		tmp+= "	<div class=\"tips_top\"></div>";
		tmp+= "	<div class=\"tips_bottom\"/>";
		tmp+= "</div>";
		$("body").append(tmp);
	}
	$("#validatorBox").hide();
	if(type=="A"){
		$("#validatorBox .tips_top").css("background-position","-57px -24px");
		$("#validatorBox .tips_bottom").css("background-position","-57px -199px");
		
	}else{
		$("#validatorBox .tips_top").css("background-position","-57px -233px");
		$("#validatorBox .tips_bottom").css("background-position","-57px -439px");	
	}
	$("#validatorBox").css("position","absolute");
	$("#validatorBox").css("z-index","20000");
	$("#validatorBox").css("left",_left+"px");
	$("#validatorBox").css("top",_top+"px");
	$("#validatorBox .tips_top").html(msg);
	
	$("#validatorBox").show();  
}
*/
function drowValidateBox(who,where,id){
	$(who).prepend("<div id='"+id+"_vbox' style=\"float: right; width: 180px; line-height: 120%; font-size:10px;\"></div>");
}
function sayValidateBox(id,type,text){
	$("#"+id+"_vbox").show();
	if(type=="alert"){
		$("#"+id+"_vbox").html("<div class='vali_alert' style='background:transparent url(/media/helper_arrow2.gif) no-repeat scroll 0 0;padding-left:12px;'>"+text+"</div>");
	}
	if(type=="msg"){
		$("#"+id+"_vbox").html("<div class='vali_msg' style='background:transparent url(/media/helper_arrow3.gif) no-repeat scroll 0 0;padding-left:12px;color:#C00E0C;'>"+text+"</div>");
	}
	if(type=="ok"){
		$("#"+id+"_vbox").html("<div class='vali_ok' style='background:none;padding:0;'><img src='/media/checkbullet.png' style='background:none;border:0;'/></div>");
	}	
	if(type=="hide"){
		$("#"+id+"_vbox").html("");
	}	
}

var formValidatorType = "";
jQuery.formValidator = {
    ids:[],
    init: function (o){
    	if (!o) return ;
        return this.each(
            function (){                
                var el = this;
                var jel = jQuery(this);
                jQuery.formValidator.argInit.apply(this,[o]);                
                jel.bind('blur', jQuery.formValidator.start);
                jQuery.formValidator.ids.push(el);
				
				var parent = $(jel).parent();
				
				drowValidateBox(parent,"append",this.id); //预处理box
                
            	jel.focus(function(){//响应focus事件
            		formValidatorType = "";
            		jQuery.formValidator.toggleA.apply(this);
            	});
            	
                /*jel.blur(function(){//响应blur事件              	
                });*/
            }
        );
    },
    toggleV: function(o){
    	this.fvCfg.Status ="V";
    	if(this.fvCfg.empty){
    		sayValidateBox(this.id,"hide","OK");
    	}else{
    		sayValidateBox(this.id,"ok","OK");
    	}    	
    	
    	$(this).css("background-color","#E2FFD2");
    },
    toggleM: function(o){
    	this.fvCfg.Status ="M";
		if(typeof(this.fvCfg.D) == "undefined"){this.fvCfg.D=this.fvCfg.oldmsg}
		if (this.fvCfg.D.constructor == Function){ //如果是方法
			this.fvCfg.D.apply(this,this.fvCfg.V);
		}else{
			$(this).css("background-color","#FFE4E4");//如果是文本
			sayValidateBox(this.id,"msg",this.fvCfg.D);
		}    	
    },
    toggleA: function(o){
    	this.fvCfg.Status ="S";
    	$(this).css("background-color","#FFFFD7");
    	if(this.fvCfg.alt){
    		sayValidateBox(this.id,"alert",this.fvCfg.alt);
    	}else{
    		sayValidateBox(this.id,"hide","OK");
    	}
    },
    argInit: function(o){
        //验证配置初始化
        this.fvCfg = {
            imgId:  this.id + "error",
            group:  o.group || o.G || "",
            msg:    o.msg || o.M || "",
            oldmsg:    o.msg || o.M || "",
            alt:    o.alt || o.A || "",
            empty:  o.empty || o.E || false,
            V:      o.V || o.valid || null,
            Status:		"S" //状态,S，开始；A：提示；M：错误信息，V：成功
        };
    }    ,
    start: function(value){
             
        if(this.fvCfg.V == null) return;
        if(this.tagName == "INPUT" || this.tagName == "TEXTAREA" || this.tagName == "SELECT"){ 
            value = this.value;
        }
        value = value.toString().replace(/^\s+|\s+$/g, '').replace(/\r/ig,"").replace(/\n/ig,"").replace(/\"/g,"'").replace(/\\/g,"'"); //替换掉首尾空格与中间的换行符 NtoS
        var flag = true;        
        if(this.fvCfg.V.constructor == Object){
            this.fvCfg.P = this.fvCfg.V.P;
            this.fvCfg.D = this.fvCfg.V.M || "On error.";
            flag = eval("jQuery.formValidator." + this.fvCfg.V.T + ".apply(this,[\""+value+"\"])");
        }
        else if(this.fvCfg.V.constructor == Array){
            for(var i in this.fvCfg.V){
                this.fvCfg.P = this.fvCfg.V[i].P;
                this.fvCfg.D = this.fvCfg.V[i].M || this.fvCfg.oldmsg || "On error.";
                flag = eval("jQuery.formValidator." + this.fvCfg.V[i].T + ".apply(this,[\""+value+"\"])");
                if (!flag) break;
            }
        }        
        flag = !flag ? (this.fvCfg.empty ? (value == "" ? true : false) :false ) : true;
		if(flag){//成功
            jQuery.formValidator.toggleV.apply(this);
		}else{//失败
			jQuery.formValidator.toggleM.apply(this);
			if(formValidatorType=="-1"){//开始submit判断
				formValidatorType = this.id;
			}
        }
        return flag;
    },
    I: function(value){        
        var P   = this.fvCfg.P;
        var T   = P.type || P.T || "S";
        var min = P.min || 0;
        var max = P.max || 65000;
        var M   = this.fvCfg.D;
        if(T.toUpperCase() == "N") {//验证数字
            if(M) this.fvCfg.msg = M;
            return (Number(value) >= min && Number(value) <= max) ? true : false;
        }
        else {//验证字符
            if(M) this.fvCfg.msg = M;
            return (value.length >= min && value.length <= max) ? true : false;
        }
    },
    C: function(value){
        var id    = this.fvCfg.P;
        var M   = this.fvCfg.D;
        if(M) this.fvCfg.msg = M;
        return jQuery("#" + id).val() == value ? true : false;        
    },
    R: function(value){
        var P = this.fvCfg.P;
        var regexp = (P.constructor != Object) ? P : P.regexp || P.R;
        var I = P.I || false;
        var re = regexp.constructor == RegExp ? regexp : I ? new RegExp(regexp) : new RegExp(regexp,"i") ;
        var M   = this.fvCfg.D;
        if(M) this.fvCfg.msg = M;
        return re.test(value);
    },
    F: function(value){
    	var M = this.fvCfg.D;
        if(M) this.fvCfg.msg = M;
        return (this.fvCfg.P.constructor == Function) ? this.fvCfg.P.apply(this,[value]) : false;
    },
    isValid: function(group){
    	formValidatorType = "-1";
        var valid = true;
        var G = group || "";
        var flag;
        jQuery.each(jQuery.formValidator.ids,function(i,e){
            if(G == e.fvCfg.group || G =="") {
                flag = jQuery.formValidator.start.apply(e);
                if(!flag) valid = false;
            }
        });
        if(!valid){
        	window.scrollTo(0,$("#"+formValidatorType).offset().top);
        	}
        return valid;
    }   
};

jQuery.fn.extend(
	{
		FV : jQuery.formValidator.init,
		isValid : jQuery.formValidator.isValid
	}
);

var regexEnum = 
{
	intege:"^-?[1-9]\\d*$",					//整数
	intege1:"^[1-9]\\d*$",					//正整数
	intege2:"^-[1-9]\\d*$",					//负整数
	num:"^([+-]?)\\d*\\.?\\d+$",			//数字
	num1:"^[1-9]\\d*|0$",					//正数（正整数 + 0）
	num2:"^-[1-9]\\d*|0$",					//负数（负整数 + 0）
	decmal:"^([+-]?)\\d*\\.\\d+$",			//浮点数
	decmal1:"^[1-9]\\d*.\\d*|0.\\d*[1-9]\\d*$",　　	//正浮点数
	decmal2:"^-([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*)$",　 //负浮点数
	decmal3:"^-?([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*|0?.0+|0)$",　 //浮点数
	decmal4:"^[1-9]\\d*.\\d*|0.\\d*[1-9]\\d*|0?.0+|0$",　　 //非负浮点数（正浮点数 + 0）
	decmal5:"^(-([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*))|0?.0+|0$",　　//非正浮点数（负浮点数 + 0）

	email:"^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$", //邮件
	color:"^[a-fA-F0-9]{6}$",				//颜色
	//url:"^(([\\w-]+\\.)+[\\w-]?![\(\)]+([^<>\"\\s]*)?)|((ht|f)tps?:\\/\\/(([\\w-]+\\.)+[\\w-]?![\(\)]+([^<>\"\\s]*)?)?)$",	//url
	url:"^(([0-9a-zA-Z-_]+\\.)+[0-9a-zA-Z-_]+([^<>\"\\s]*)?)|((ht|f)tps?:\\/\\/(([0-9a-zA-Z-_]+\\.)+[0-9a-zA-Z-_]+([^<>\"\\s]*)?)?)$",
	//原来的
	//url:"^http[s]?:\\/\\/([\\w-]+\\.)+[\\w-]+([\\w-./?%&=]*)?$",	//url
	irc:"^(#\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+)|(http[s]?:\\/\\/([\\w-]+\\.)+[\\w-]+([\\w-./?%&=]*)?)$", //irc判断
	chinese:"^[\\u4E00-\\u9FA5\\uF900-\\uFA2D]+$",					//仅中文
	ascii:"^[\\x00-\\xFF]+$",				//仅ACSII字符
	zipcode:"^\\d{6}$",						//邮编
	mobile:"^(13|15)[0-9]{9}$",				//手机
	ip4:"^(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5]).(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5]).(d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5]).(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])$",				//ip地址
	notempty:"^\\S+$",						//非空
	picture:"(.*)\\.(jpg|bmp|gif|ico|pcx|jpeg|tif|png|raw|tga)$",	//图片
	rar:"(.*)\\.(rar|zip|7zip|tgz)$",								//压缩文件
	date:"^\\d{4}(\\-|\\/|\.)\\d{1,2}\\1\\d{1,2}$",					//日期
	qq:"^[1-9]*[1-9][0-9]*$",				//QQ号码
	tel:"(\\d{3}-|\\d{4}-)?(\\d{8}|\\d{7})",	//国内电话
	username:"^\\w+$",						//用来用户注册。匹配由数字、26个英文字母或者下划线组成的字符串
	letter:"^[A-Za-z]+$",					//字母
	letter_u:"^[A-Z]+$",					//大写字母
	letter_l:"^[a-z]+$",					//小写字母
	idcard:"^[1-9]([0-9]{14}|[0-9]{17})$",	//身份证
	ozuserformat:"^[A-Za-z0-9]+$" //oz的用户格式
	
}
