/* ******************************高级验证组件************************************ */
var Validator = new Object();

Validator.pattern=function(v,p){
		if(!p.test(v)){
			return false;
		}
		return true;
}

Validator.types ={
		username:function(v){
			var p = /^[A-Za-z]+[\w]{1,20}$/i;
			return Validator.pattern(v,p);
		},
		password:function(v){
			var p = /.{6,20}/;
			return Validator.pattern(v,p);
		},
		email:function(v){
			var p = /^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i;
			return Validator.pattern(v,p);
		},
		url:function(v){
			var p =/^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/;
			return Validator.pattern(v,p);
		},
		phone:function(v){
			var p = /^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$/;
			return Validator.pattern(v,p);
		},
		mobile:function(v){
			var p =  /^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$/;
			return Validator.pattern(v,p);
		},
		idCard:function(v){
			var p = /^\d{15}(\d{2}[A-Za-z0-9])?$/;
			return Validator.pattern(v,p);
		},
		number :function(v){ 
			var p = /^\d+$/;
			return Validator.pattern(v,p);
		},
		zip :function(v){ 
			var p = /^[0-9]\d{5}$/;
			return Validator.pattern(v,p);
		},
		qq :function(v){
			var p= /^[1-9]\d{4,8}$/;
			return Validator.pattern(v,p);
		},
		integer :function(v){
			var p=  /^[-\+]?\d+$/;
			return Validator.pattern(v,p);
		},
		english :function(v){ 
			var p = /^[A-Za-z]+$/;
			return Validator.pattern(v,p);
		},
		chinese :function(v){ 
			var p =  /^[\u0391-\uFFE5]+$/;
			return Validator.pattern(v,p);
		},
		unSafe :function(v){
			var p =  /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}\?\\\/\"]*)|.{0,})$|\s/;
			return Validator.pattern(v,p);
		},
		max:function(v,p){
				if($.trim(v)){
				return Validator.pattern(v,$.trim(v).length>p?false:true);
			}else{
				return Validator.pattern(v,true);
			}
		},
		min:function(v,p){
			if($.trim(v)){
				return $.trim(v).length<p?false:true;
			}else{
				return true;
			}
		},
		required:function(v){
			return $.trim(v);
		},
		pattern:function(v,p){
			return Validator.pattern(v,p);
		},
		equal:function(v,p){
			// p 必须为ID
			return v==$("#"+p).val();
		},
		ajax:function(v,p){
			var callback = p.F;
			callback.call(p,{V:v,E:p.E,C:p.C});
			return true;
		},
		group:function(v,p,pt){
			// radio按钮组,v表单
			var flag = false;
			
			if(p.type=="radio"){
				var radios = $(v).find("input[@name='"+p.name+"']");
				for(var i=0;i<radios.length;i++){
					if(radios[i].checked){
						return true;
					}
				}
			}else if(p.type=="checkbox"){
				
				var radios = $(v).find("input[@name='"+p.name+"']");
				var num = 0;
				
				for(var i=0;i<radios.length;i++){
					if(radios[i].checked){
						num++;
					}
				}
				if((pt.MAX||0) >= num && (pt.MIN||0) <= num){
					flag = true;
				}
			}
			return flag;
		}
}
/** 
 * 表单css动态验证
 * @tform 要验证的表单ID
 */
Validator.FormDynCss = function (tform){
	$("#"+tform+" *[@validator]").focus(
		function(){
			$(this).css({background:"#FFFF99", border:"1px solid #99CCFF"});
		}
	).blur(
		function(){
			var showtype = Validator.showType["inputside"];
			showtype(this);
		}
	)
}

/** 
 * 表单提交验证
 * @tform 要验证的表单ID
 */
Validator.FormSubmit=function(tform){
	var errors = new Array();
	$("#"+tform+" *[@validator]").each(function(){
		var showtype = Validator.showType["inputside"];
		var error = showtype(this);
		if(error){ errors.push(error) };
	});
	if(errors.length>0){
		return false;
	}else{
		return true;
	}
}
/**
 * 验证的表现形式
 */
Validator.showType={
	inputside:function(tEle){
		var pclass = "validator_prompt";
		var tvalidator = eval("("+$(tEle).attr("validator")+ ")");
		// 标题
		var title = tvalidator.title;
		// 规则
		var rule = tvalidator.rule;

		var validators = tvalidator.types;

		for(var i=0;i<validators.length;i++){
			// 调用的函数名
			var type = validators[i].T;
			// 要调用的函数
			var fn = Validator.types[type];
			// 错误提示的消息
			var msg = validators[i].M;
			// 参数
			var pt = validators[i].P;
			// 是否检查
			var ischeck = validators[i].CK;
			if (ischeck){
				if(!tEle.value){
					return;
				}
			}
			if(type=="ajax"){
				Validator.tipType.create({E:tEle,M:"Loading...",C:pclass});
				fn(tEle.value,{F:pt,E:tEle,C:pclass})
				return;
			}else if(type=="group"){
				if(!fn($(tEle).parent(),tEle,pt)){
					Validator.tipType.create({E:tEle,M:msg,C:pclass});
					return {E:tEle,M:msg};
				}else{
					Validator.tipType.del({E:tEle,C:pclass});
				}
			}else if(!fn(tEle.value,pt)){
				Validator.tipType.create({E:tEle,M:msg,C:pclass});
				return {E:tEle,M:msg};
			}else{
				Validator.tipType.del({E:tEle,C:pclass});
			}
		}
		$(tEle).css({background:"transparent", border:"1px solid #049ff1"});
	}
}
Validator.tipType={
	create:function(p){
		var tEle = p.E;
		var msg = p.M;
		var pclass = p.C;
		$(tEle).parent().find("."+pclass).remove();
		var pspan = $.SPAN({Class:pclass},"- "+msg);
		$(tEle).after(pspan);
		$(pspan).fadeIn("slow");
		$(tEle).css({background:"#fcc", border:"1px solid #f00"});
	},
	del:function(p){
		$(p.E).parent().find("."+p.C).slideUp("slow").remove();
	}
}
