var MAGIC_CHECK = {};

function Magic_validator(className, error, test, options){
		this.className = className;
		this.error = error ? error : function(){ return "填写错误"; };
		this.test = test ? test : function(){ return true; };
		this.options = $.extend({}, options || {}); 
}

function Magic_validation(formId,options){
	this.formElm = $("#" + formId)[0];
	this.formid = formId;
	this.options = $.extend(
	{
		defaultTitle : "该项",
		defaultPass : "校验通过",
		onSubmit : true,
		usebutton : "",
		onReset : true,
		inputfocus : true,
		noFocus : "onfocus",
		inputkeypress : true,
		noActiveCheck : "noactivecheck",
		realTime : true,
		stopOnFirst : false,
		immediate : false,
		focusOnError : true,
		useRequired : "box",
		requiredPlace : "after",
		useIntro : false,
		introPlace : "after",
		useErrorToIntro : true,
		useError : true,
		errPlace : "after",
		msgType : "single_msg",
		formAjaxUrl: "",
		useAjaxType: "onblur",
		useAjaxBox: false,
		useTitle : true,
		msgBox : "",
		elmAjaxTimer : 10000,
		formAjaxTimer : 20000,
		onFormValidate : function(){ return true; },
		onElementValidate : function() { return true; },
		msgGroup: {}
	}, options || {});
	
	this.initValidation();
}

Magic_validation.prototype = {

	initValidation : function(){
		//var formid = $(this.formElm).attr("id") ;
		var formid = this.formid;
		MAGIC_CHECK[formid] = this;
		this.initAllFormElm();
		if(this.options.onSubmit)
		{
			$(this.formElm).bind("submit",formid,Magic_validation.submitForm);	//对Form的submit事件进行注册
		}
		if(this.options.onReset)
		{
			$(this.formElm).bind("reset",formid,Magic_validation.resetForm);	//对Form的reset事件进行注册
		}
		if(this.options.usebutton) //如果设置了button按钮，则对button按钮的click事件进行注册
		{	
			var aButtonId = this.options.usebutton.split(",");	//将字符串分割成数组
			for( var i = 0; i < aButtonId.length; i++ )
			{
				$("#"+aButtonId[i]).bind("click",formid,Magic_validation.checkForm);	//对button的click事件进行注册
			}
		}
	},
	
	initAllFormElm: function(){
		var _this = this;
		$(":input",this.formElm).each(function()
		{
			_this.initFormElm(this);
		});
	},
	
	initFormElm: function(elm){
		var isCheck = Magic_validation.validate(elm,this.options)[1];
		//var formid = $(this.formElm).attr("id");
		var formid = this.formid;
		Magic_validation._formatId(elm);
		if(isCheck)
		{
			if(!Magic_validation._filter(this.options.noFocus,elm))	//此处对this.options.noFocus参数进行过滤。
			{	
				if((this.options.inputfocus || $("#" + this.options.msgBox).length > 0))	//注意，此处如果this.options.msgBox如果为true，则Form元素的focus和blur的事件必须进行注册，为了说明和校验信息的显示和隐藏。
				{	
					$(elm).bind("focus",formid,Magic_validation.changeInputState);
					$(elm).bind("blur",formid,Magic_validation.resetInputState);
				}
			}
			if(!Magic_validation._filter(this.options.noActiveCheck,elm))	//此处对this.options.noActiveCheck,elm参数进行过滤。
			{	
				if(this.options.inputkeypress )
				{
					//对于非单选，复选、下拉框的Form元素的keyup事件进行注册。
					if(elm.type.toLowerCase() != "checkbox" && elm.type.toLowerCase() != "radio" && elm.tagName.toLowerCase() != "select")
					{
						$(elm).bind("keyup",formid,Magic_validation.checkOne_keypress);
					}
					//对于文件选择，复选，单选，下拉框的Form元素的change,click,focus的事件进行注册。
					if(elm.type.toLowerCase()=="file" || elm.type.toLowerCase()=="checkbox" || elm.type.toLowerCase()=="radio" || elm.tagName.toLowerCase() == "select")
					{
						$(elm).bind("change",formid,Magic_validation.checkOne_keypress);
						$(elm).bind("click",formid,Magic_validation.checkOne_keypress);
						$(elm).bind("focus",formid,Magic_validation.checkOne_keypress);
					}
				}
				if(this.options.immediate ) 
				{
					$(elm).bind("blur",formid,Magic_validation.checkOne_blur);
				}
			}
		}
		else
		{
			Magic_validation.clearElm(elm);
		}
	}
}; 

$.extend(Magic_validation,{
	
	changeInputState: function(event){
		var options = MAGIC_CHECK[event.data].options;
		//var checkForm = MAGIC_CHECK[event.data].options;
		var sId = $(this).attr("id");
		var sName = Magic_validation._getsName(this);	//针对checkbox和radio的一个特殊处理
		if($("#" + options.msgBox).length > 0)	//当要将校验说明放入统一的msgBox中的时候，即msgBox不为空，需对所有msg_intro_box和msg_err_box的class值进行处理
		{	
			$("#" + options.msgBox + " > span").removeClass("msg_intro_focus").removeClass("msg_err_focus");
		}
		if(!Magic_validation._filter('validation_failed',this))//如果当前校验字段className有validation_failed，则改变其对应的msg_intro_box和msg_err_box的class值
		{	
			$('#msg_err_' + sName).removeClass('msg_err_show').removeClass('msg_err_focus'); 
			$('#msg_intro_' + sName).removeClass('msg_intro_hide').addClass('msg_intro_focus');
		}
		else
		{
			$('#msg_err_' + sName).addClass('msg_err_focus');
		}
		$(this).addClass('validation_focus');	//添加一个属性给自己本身的class

	},
	
	resetInputState: function(event){
		var options = MAGIC_CHECK[event.data].options;
		var sId = $(this).attr("id");
		var sName = Magic_validation._getsName(this);
		if(!$("#" + options.msgBox).length > 0)	//如果没有将校验说明放入统一的msgBox中，即msgBox为空，则对校验字段对应的msg_intro_box和msg_err_box的class值进行处理
		{	
			$('#msg_intro_' + sName).removeClass('msg_intro_focus');
			$('#msg_err_' + sName).removeClass('msg_err_focus');
		}
		$(this).removeClass('validation_focus'); //移除一个属性给自己本身的class		
	},
		
	checkView: function(elm,options,onKeyup){
		var sName = Magic_validation._getsName(elm);
		var result = Magic_validation.validate(elm,options);
		var checkResult = result[0];
		var isCheck = result[1];
		if(!isCheck){ return checkResult; }
		if(!checkResult){
			if(elm.type != "hidden")
			{
				$(elm).removeClass('validation_passed').addClass('validation_failed').removeClass('kepress_pass').addClass('kepress_failed');
			}
			$('#msg_err_'+ sName).addClass('msg_err_show');
			if(onKeyup || $("#" + options.msgBox).length > 0)	//当前函数是否应用在checkOne_keypress()中或者this.options.msgBox存在
			{	
				$('#msg_err_'+ sName).addClass('msg_err_focus');
			}
			$('#msg_err_'+ sName).removeClass('msg_err_pass');
			$('#msg_intro_'+ sName).addClass('msg_intro_hide');
		}else{
			if(elm.type != "hidden")
			{
				$(elm).removeClass('validation_failed').addClass('validation_passed').removeClass('kepress_failed').addClass('kepress_pass');
			}
			$('#msg_err_'+ sName).addClass('msg_err_show');
			if(onKeyup || $("#" + options.msgBox).length > 0)
			{
				$('#msg_err_'+ sName).addClass('msg_err_focus');
			}
			$('#msg_err_'+ sName).addClass('msg_err_pass');
			$('#msg_intro_'+ sName).addClass('msg_intro_hide');
		}
		return checkResult;
	},
	
	simpleCheckView: function(elm,options){
		if(Magic_validation.validate(elm,options)[0]){
			$(elm).removeClass('kepress_failed').addClass('kepress_pass');
		}else{
			$(elm).removeClass('kepress_pass').addClass('kepress_failed');
		}		
	},

	checkOne_keypress: function(event){
		var options = MAGIC_CHECK[event.data].options;
		if(options.realTime)	//根据this.options.realTime显示形式不同
		{	
			Magic_validation.checkView(this,options,true);
		}
		else
		{
			Magic_validation.simpleCheckView(this,options);
		}	
	},
	
	checkOne_blur: function(event){
		var options = MAGIC_CHECK[event.data].options;
		Magic_validation.checkView(this,options,true);
	},
	
	submitForm : function(event){
		Magic_validation._eventStop(event);	//停止Form的sumbit()事件
		Magic_validation.checkForm(event);	//调用checkForm方法对Form进行验证。
	},
	
	checkForm: function(event){
		var result = Magic_validation.checkAll(event.data);
		if(result){
			$("#" + event.data)[0].submit();
		}
	},
	
	checkAll: function(formId){
		//alert(formId);
		//alert(MAGIC_CHECK[formId]);
		//alert(MAGIC_CHECK);
		/*
		for(i in MAGIC_CHECK)
		{
			alert(i);
		}
		*/
		var checkForm = $("#" + formId)[0];
		var options = MAGIC_CHECK[formId].options;
		var result = true;
		var $formElmGroup = $(":input",checkForm);
		$formElmGroup.each(function(){
			if(!Magic_validation.checkView(this,options))
			{
				result = false;
				if(options.stopOnFirst)
				{
					if(this.type != "hidden")
					{
						this.focus();
						return result;
					}
				}
			}
		});

		//将焦点设置在第一个出错的字段
		if(!result && options.focusOnError) 
		{
			var $errGroup = $formElmGroup.filter(".validation_failed");
			if($errGroup.length > 0)
			{
				$errGroup[0].focus();
			}
		}
		return result;
	},

	resetForm: function(event){
		var checkForm = $("#" +event.data)[0];
		$(":input",checkForm).each(function(){
				var sName = Magic_validation._getsName(this);
				$(this).removeClass('validation_failed').removeClass('validation_passed').removeClass('validation_focus').removeClass('kepress_pass').removeClass('kepress_failed');
				$("#msg_err_" + sName).removeClass('msg_err_show').removeClass('msg_err_focus').removeClass('msg_err_pass');
				$("#msg_intro_" + sName).removeClass('msg_intro_hide').removeClass('msg_intro_focus');
				$("#msg_ajax_" + sName).removeClass('msg_err_show').removeClass('msg_err_focus').removeClass('msg_err_pass');
				
			});
	},
	
	validate : function(elm,options){
		var sId = $(elm).attr("id");
		var aClassNames = elm.className.split(" ");
		if(aClassNames.length == "0") 
		{
			return; 
		}
		var checkResult = true;	//form元素的校验结果
		var isCheck = false;	//form元素是否需要被校验
		var sInfo = "";	//form元素的填写说明
		var sError = "";	//form元素的出错信息
		
		//变量form元素的所有classname，从中对是校验标志的进行处理，改变校验结果和是否需要校验的状态，对填写说明和出错信息进行处理。
		$.each(aClassNames,function(i,sClassName){
			var aClassName = sClassName.split("-");
			var sValidate = aClassName.shift();
			var aExend = aClassName;
			aExend.unshift(elm);
			var v = Magic_validation.get(sValidate);
			if(v == "none")	
			{
				return;
			}
			isCheck = true;
			var fnTest = v.test;
			var fnError = v.error;
			var result = fnTest.apply(this,aExend);
			var sErr =  fnError.apply(this,aExend);
			if(!result)
			{
				checkResult = false;
			}
			if(options.useErrorToIntro)
			{
				sInfo = sInfo + Magic_validation._makeString(Magic_validation._makeError(elm,sValidate,sInfo,sErr,options));
			}
			switch(options.msgType){
				case "all_msg" :
					sError = sError + Magic_validation._makeString(Magic_validation._makeError(elm,sValidate,sError,sErr,options));
					break;
				case "need_msg" :
					if( !result )
					{
						sError = sError + Magic_validation._makeString(Magic_validation._makeError(elm,sValidate,sError,sErr,options));
					}
					break;
				case "single_msg" :	//single_msg 和默认都显示单条出错信息
				default:	
					if( !result && sError == "")
					{
						sError = sError + Magic_validation._makeString(Magic_validation._makeError(elm,sValidate,sError,sErr,options));
					}
					break;
			}
		});
		if(checkResult)
		{
			sError = this._makeString(options.defaultPass);
		}
		else if(options.useError && options.msgGroup[sId] && options.msgGroup[sId].msg_err && options.msgGroup[sId].msg_err.default_err)
		{
			sError = this._makeString(options.msgGroup[sId].msg_err.default_err);
		}
		if(options.useIntro && options.msgGroup[sId] && options.msgGroup[sId].msg_intro)
		{
			sInfo = options.msgGroup[sId].msg_intro;
		}
		
		if(isCheck)
		{
			Magic_validation.checkRequired(elm,options);
			Magic_validation.checkInfo(elm,options,sInfo);
			Magic_validation.checkError(elm,options,sError);
			//外部扩展函数
			options.onElementValidate(checkResult,elm,options);
		}
		return [checkResult,isCheck];
	},
	
	clearElm: function(elm){
		var sName = Magic_validation._getsName(elm);
		$("#msg_err_" + sName).remove();
		$("#msg_intro_" + sName).remove();
		$("#required_" + sName).remove();
		$(elm).removeClass("validation_required").removeClass("validation_failed").removeClass("validation_passed").removeClass("validation_focus").removeClass("kepress_pass").removeClass("kepress_failed");
		$(elm).unbind("keyup",Magic_validation.checkOne_keypress);
		$(elm).unbind("click",Magic_validation.checkOne_keypress);
		$(elm).unbind("change",Magic_validation.checkOne_keypress);
		$(elm).unbind("focus",Magic_validation.checkOne_keypress);
		$(elm).unbind("blur",Magic_validation.checkOne_blur);
	},
	
	checkError: function(elm,options,sError){
		var sName = Magic_validation._getsName(elm);
		if($("#msg_err_" + sName).length < 1) //如果"msg_err_" + sName不存在，则对其进行建立
		{	
			var sMsgErrBox = '<span id = "msg_err_' + sName +'" class="msg_err_style"></span>';
			if($("#" + options.msgBox).length > 0) //对置入位置进行处理
			{	
				$("#" + options.msgBox).append(sMsgErrBox);
			}
			else
			{
				switch(options.errPlace)
				{
					case "before" :
						$(elm).before(sMsgErrBox);
						break;
					case "after" :
						$(elm).after(sMsgErrBox);
						break;
					case "bottom" :
						$(elm).parent().append(sMsgErrBox);
						break;
					case "nextSibling" :
						$(elm).parent().next().append(sMsgErrBox);
						break;
					case "prevSibling" :
						$(elm).parent().prev().prepend(sMsgErrBox);
						break;
					default:
						if($("#"+options.errPlace + "_" + sName).length > 0)
						{
							$("#"+options.errPlace + "_" + sName).append(sMsgErrBox);
						}
						else
						{
							$(elm).after(sMsgErrBox);
						}
				}		
			}
		}
		$("#msg_err_" + sName).html(sError);
	},
	
	checkInfo: function(elm,options,sInfo){
		var sName = Magic_validation._getsName(elm);
		if($("#msg_intro_" + sName).length < 1) //如果"msg_intro_" + sName不存在，则对其进行建立
		{	
			var sIntroBox = '<span id="msg_intro_' + sName +'" class="msg_intro_style"></span>';
			if($("#" + options.msgBox).length > 0 )//对说明容器放置的位置进行处理
			{
				$("#" + options.msgBox).append(sIntroBox);
			}
			else
			{
				switch(options.introPlace)
				{
					case "before" :
						$(elm).before(sIntroBox);
						break;
					case "after" :
						$(elm).after(sIntroBox);
						break;
					case "bottom" :
						$(elm).parent().append(sIntroBox);
						break;
					case "nextSibling" :	
						$(elm).parent().next().append(sIntroBox);
						break;
					case "prevSibling" :	//由于prevSibling在这个应用里用的时候有问题，做了以下处理
						$(elm).parent().prev().prepend(sIntroBox);
						break;
					default:	//默认情况插入名为this.options.introPlace + "_" + sName的容器中
						if($("#"+options.introPlace + "_" + sName).length > 0)
						{
							$("#"+options.introPlace + "_" + sName).append(sIntroBox);
						}
						else
						{
							$(elm).after(sIntroBox);
						}
						break;
				}		
			}
		}
		$("#msg_intro_" + sName).html(sInfo);
	},
	
	checkRequired: function(elm,options){
		var sName = Magic_validation._getsName(elm);
		if($("#required_" + sName ).length < 1)
		{
			if(options.useRequired && /required/.test(elm.className)) //如果当前Form元素样式如果和required匹配
			{	
				switch(options.useRequired)	//进行修饰选择，box：添加*，class：添加样式
				{	
					case "box" :
						var sRequiredBox = '<span class="required_box_style" id="required_' + sName + '">*</span>';
						//将容器插到该字段之后
						switch(options.requiredPlace)
						{
							case "before" :
								$(elm).before(sRequiredBox);
								break;
							case "after" :
								$(elm).after(sRequiredBox);
								break;
							case "bottom" :
								$(elm).parent().append(sRequiredBox);
								break;
							case "nextSibling" :
								$(elm).parent().next().append(sRequiredBox);
								break;
							case "prevSibling" :
								$(elm).parent().prev().prepend(sRequiredBox);
								break;
							default:
								if($("#"+options.requiredPlace + "_" + sName).length > 0)
								{
									$("#"+options.requiredPlace + "_" + sName).prepend(sRequiredBox);
								}
								else
								{
									$(elm).after(sRequiredBox);
								}
								break;
						}
						break;
					case "class" :
						$(elm).addClass("validation_required");
						break;
					default:
						break;
				}
			}
		}
	},
	_getsName: function(elm){
		return (elm.type.toLowerCase()=="checkbox" || elm.type.toLowerCase()=="radio") ? elm.name : $(elm).attr("id");
	},
	
	_makeString : function(sString){
		return "<span>" + sString + "</span>";
	},

	_makeError : function(elm,validator,sError,sErr,options){
		var sId = $(elm).attr("id");
		if(options.useError && options.msgGroup[sId] && options.msgGroup[sId].msg_err && options.msgGroup[sId].msg_err[validator])
		{
			return options.msgGroup[sId].msg_err[validator];
		}
		else
		{
			if(sError == "" )
			{
				var sTitle = options.useTitle ? (elm.title ? elm.title : options.defaultTitle) : options.defaultTitle;
				//if(validator == "v_getone" || validator == "ajax") sTitle="";
				sErr = sTitle + sErr;
			}
			return sErr;
		}
	},

	_filter : function(filter,elm){
		var cn = elm.className;
		var regexp = new RegExp(filter);
		return regexp.test(cn);
	},
	
	_eventStop: function(event){
		event = event || window.event;
		if (event.preventDefault) 
		{
	      event.preventDefault();
	      event.stopPropagation();
	    }
		else
		{
	      event.returnValue = false;
	      event.cancelBubble = true;
	    }
		return false;
	},

	_formatId : function(elm){
		var defaultId = 1;
		if( !$(elm).attr("id") ){
			while ($("#checkForm_" + defaultId).length > 0){
				defaultId ++;
			}
			$(elm).attr('id',"checkForm_" + defaultId);
		}
	},

	add : function(className, error, test, options) {
		var nv = {};	//声明一个空对象
		nv[className] = new Magic_validator(className, error, test, options);	//实例化Magic_validator，将值赋给nv的[className]属性
		$.extend(Magic_validation.methods, nv);	//将nv继承给Magic_validation.methods
	},

	addAllThese : function(validators) {
		var nv = {};
		$.each(validators,function(i,value) {	//遍历数组。
				nv[value[0]] = new Magic_validator(value[0], value[1], value[2], (value.length > 3 ? value[3] : {}));
			});
		$.extend(Magic_validation.methods, nv);
	},

	get : function(name) {
		return  Magic_validation.methods[name] ? Magic_validation.methods[name] : "none";
	},
	methods : {}
});

Magic_validation.add('IsEmpty', function(){return '';}, function(v) {
				return  ((v == null) || (v.length == 0)); // || /^\s+$/.test(v));
			});
Magic_validation.addAllThese(
[
	//判断必填，分为[radio,checkbox][select][other]，其中select还可以设置默认缺省值类型required-selectValue，这样可以对所有选择到默认类型的select判断为false;
	['required', 
		function(elm) 
		{
			if(elm.tagName.toLowerCase()=="select" || elm.type.toLowerCase()=="radio")
			{
				return '为必选项；';
			}
			if(elm.type.toLowerCase()=="checkbox")
			{
				return '至少选择其中一项；';
			}
			if(elm.type.toLowerCase()=="file")
			{
				return '必须选择一个文件上传；';
			}	
			return '为必填项；';
		}, 
		function(elm) 
		{
			var v = $(elm).val();
			if(elm.tagName.toLowerCase()=="select")
			{
				v = elm.options[elm.selectedIndex].value;
				var defaultValue = arguments[1] ? arguments[1] : "";
				return (v == defaultValue) ? false : true;
			}
			if(elm.type.toLowerCase()=="radio" || elm.type.toLowerCase()=="checkbox")
			{
				var sName = elm.name;
				while(elm.tagName.toLowerCase() != "form")
				{
					elm = elm.parentNode;
				}
				for( var i = 0; i < elm[sName].length ; i++)
				{
					if(elm[sName][i].checked == true) return true;
				}
				return false;
			}
			if(elm.type.toLowerCase()=="file")
			{
				return !Magic_validation.get('IsEmpty').test(elm.value);
			}
			return !Magic_validation.get('IsEmpty').test(v);
		}],
	//判断是否为有效数字，这里包括了浮点数，负数，如:12.3,-10
	['v_number',
		function() 
		{
			return '只能填写有效数字；';
		},
		function(elm) 
		{
			var v = $(elm).val();
			return Magic_validation.get('IsEmpty').test(v) || (!isNaN(v) && !/^\s+$/.test(v));
		}],
	//判断是否为数字，只能是1-9
	['v_digits',
		function() 
		{
			return "只能填写数字(0-9)；";
		},
		function(elm) 
		{
			var v = $(elm).val();
			return Magic_validation.get('IsEmpty').test(v) ||  !/[^\d]/.test(v);
		}],
	//只能填写大小写英文字母，a-zA-Z
	['v_alpha',
		function()
		{
			return "只能填写英文大小写字母(a-zA-Z)；";
		},
		function (elm) 
		{
			var v = $(elm).val();
			return Magic_validation.get('IsEmpty').test(v) ||  /^[a-zA-Z]+$/.test(v);
		}],
	//只能填写大小写英文字母和数字，a-zA-Z0-9
	['v_alphanum',
		function()
		{
			return "只能填写英文大小写字母和数字(a-zA-Z0-9)；";
		},
		function(elm) 
		{
				var v = $(elm).val();
				return Magic_validation.get('IsEmpty').test(v) ||  !/\W/.test(v);
		}],
	//校验日期（通用）格式，如**/**/****,****/**/**,**/*****/**都可以
	['v_date_normal',
		function()
		{
			return "按照正确的格式填写日期；";
		},
		function(elm) 
		{
			var v = $(elm).val();
			var test = new Date(v);
			return Magic_validation.get('IsEmpty').test(v) || !isNaN(test);
		}],
	//校验email格式
	['v_email',
		function()
		{
			return "按照正确的邮件格式填写";
		},
		function (elm) 
		{
			var v = $(elm).val();
			return Magic_validation.get('IsEmpty').test(v) || /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(v);
		}],
	//校验地址格式
	['v_url',
		function()
		{
			return "按照正确的格式填写链接地址，例如：http://www.google.com；";
		},
		function (elm) 
		{
			var v = $(elm).val();
			return Magic_validation.get('IsEmpty').test(v) || /^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i.test(v);
		}],
	//校验日期（欧洲）格式
	['v_date_au',
		function() 
		{
			return "按照以下格式填写：dd/mm/yyyy，例如 02/12/1977 代表1977年12月02日；";
		},
		function(elm) 
		{
			var v = $(elm).val();
			if(Magic_validation.get('IsEmpty').test(v)) return true;
			var regex = /^(\d{2})\/(\d{2})\/(\d{4})$/;
			if(!regex.test(v)) return false;
			var d = new Date(v.replace(regex, '$2/$1/$3'));		
			return ( parseInt(RegExp.$2, 10) == (1+d.getMonth()) ) && (parseInt(RegExp.$1, 10) == d.getDate()) && (parseInt(RegExp.$3, 10) == d.getFullYear() );
		}],
	//校验货币
	['v_currency_dollar',
		function()
		{
			return "按照正确格式填写价格（美元），例如$2,000.00；";
		},
		function(elm) 
		{
			var v = $(elm).val();
			// [$]1[##][,###]+[.##]
			// [$]1###+[.##]
			// [$]0.##
			// [$].##
			return Magic_validation.get('IsEmpty').test(v) ||  /^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/.test(v);
		}],
	//校验日期格式
	['v_date_cn', 
		function() 
		{
			return "按照以下格式填写：年-月-日，例如 1977-12-02 代表1977年12月02日；";
		},		
		function(elm) 
		{
			var v = $(elm).val();
			if(Magic_validation.get('IsEmpty').test(v)) return true;
			var regex = /^(\d{4})-(\d{2})-(\d{2})$/;
			if(!regex.test(v)) return false;
			var d = new Date(v.replace(regex, '$2/$3/$1'));
			return ( parseInt(RegExp.$2, 10) == (1+d.getMonth()) ) && (parseInt(RegExp.$3, 10) == d.getDate()) && (parseInt(RegExp.$1, 10) == d.getFullYear() );
		}],
	//校验中文
	['v_chinese', 
		function() 
		{
			return "只能填写汉字；";
		},
		function(elm) 
		{
			var v = $(elm).val();
			return Magic_validation.get('IsEmpty').test(v) || (/^[\u4e00-\u9fa5]+$/.test(v));
		}],
	//校验ip格式
	['v_ip',
		function() 
		{
			return "按照以下格式填写：192.168.0.1；";
		},
		function(elm) 
		{
			var v = $(elm).val();
			return Magic_validation.get('IsEmpty').test(v) || (/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(v));
		}],
	//校验国内座机：区号（3－4位）-电话号码（6－8位）-分机
	['v_phone',
		function() 
		{
			return "按照以下格式填写：区号-号码-分机，如：010-82898785-188；";
		},
		function(elm) 
		{
			var v = $(elm).val();
			return Magic_validation.get('IsEmpty').test(v) || (/^((0[1-9]{3})?(0[12][0-9])?[-])?\d{6,8}([-]?(\d)+)?$/.test(v));
		}],
	//校验手机号码：13和15开头的11位数字
	['v_mobilephone', 
		function() 
		{
			return "只能为13×或者15×的号码；";
		},
		function(elm) 
		{
			var v = $(elm).val();
			return Magic_validation.get('IsEmpty').test(v) || (/(^0?[1][35][0-9]{9}$)/.test(v));
		}],

	//身份证校验
	['v_idNo', 
		function(elm) 
		{ 
			var v = $(elm).val();
			if(Magic_validation.get('IsEmpty').test(v))
			{
				return "长度为15位或18位；";
			}
			if( !(v.length == 15 || v.length == 18)) 
			{
				return "长度为15位或18位，当前长度为"+ v.length+"；";
			} 
			if(!/^(1[1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]|6[1-5]|71|81|82|91)/.test(v))
			{
				return "需要填写正确的地区代码；";
			} 
			var vTemp = v;
			if( v.length == 15) 
			{
				vTemp = v.substring(0,6)+"19"+v.substring(6);
			}
			var regex = /^(1[1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]|6[1-5]|71|81|82|91)(\d{4})(\d{2}|\d{4})(\d{2})(\d{2})(\d{3}[x|X|\d]?)$/;
			var d = new Date(vTemp.replace(regex, '$4/$5/$3'));
			var d1 = parseInt(vTemp.substring(10,12), 10);
			var d2 = parseInt(vTemp.substring(12,14), 10);
			var d3 = parseInt(vTemp.substring(6,10), 10);
			var b1 = 1+d.getMonth();
			var b2 = d.getDate();
			var b3 = d.getFullYear();
			if(!( d1 == b1 && d2 == b2 && d3 == b3))
			{
				return "出生日期超出范围或含有非法字符；";
			}
			if (v.length == 18)
			{
				var wi = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
				var ai = v.split("");
				var ci = [1,0,10,9,8,7,6,5,4,3,2];
				var subwiai = 0;
				for( var i = 0; i < wi.length; i++)
				{
					subwiai = subwiai + ai[i]*wi[i];
				}
				subwiai = subwiai % 11;
				if(ci[subwiai] != ((ai[17] == "x" || ai[17] == "X")? 10 : ai[17]))
				{
					return "校验未通过；";
				}
			}
			return "长度为15位或18位；";
		},
		function(elm) 
		{
			var v = $(elm).val();
			var vTemp ="";
			if(Magic_validation.get('IsEmpty').test(v))
			{
				return true;
			}
			if(v.length != 15 && v.length != 18)
			{
				return false;
			}
			if (v.length == 18)
			{
				var wi = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
				var ai = v.split("");
				var ci = [1,0,10,9,8,7,6,5,4,3,2];
				var subwiai = 0;
				for( var i = 0; i < wi.length; i++)
				{
					subwiai = subwiai + ai[i]*wi[i];
				}
				subwiai = subwiai % 11;
				if(ci[subwiai] != ((ai[17] == "x" || ai[17] == "X")? 10 : ai[17]))
				{
					return false;
				}
			}
			var vTemp = v;
			if(v.length == 15) 
			{
				vTemp = v.substring(0,6)+"19"+v.substring(6);
			}
			var regex = /^(1[1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]|6[1-5]|71|81|82|91)(\d{4})(\d{2}|\d{4})(\d{2})(\d{2})(\d{3}[x|X|\d]?)$/;
			var d = new Date(vTemp.replace(regex, '$4/$5/$3'));
			return ( parseInt(RegExp.$4, 10) == (1+d.getMonth()) ) && (parseInt(RegExp.$5, 10) == d.getDate()) && (parseInt(RegExp.$3, 10) == d.getFullYear() );
		}],

	//对checkbox的选中数量进行校验[v_maxcheckbox-max]例如:v_maxcheckbox-2 checkbox的选择数量不能大于2
	['v_maxcheckbox',
		function() 
		{
			return "最多只能选择其中"+ arguments[1] +"项；";
		},
		function(elm) 
		{
			var str = 0;
			var sName = elm.name;
			if(!Magic_validation.get('required').test(elm))
			{
				return true;
			}
			var checkForm = $("form").filter(this + " " + elm)[0];
			$("input[@name=" + sName + "]",checkForm).each(function(){
				if(this.checked == true ){
					str ++;
				}
			});
			return (str <= arguments[1])? true : false;
		}],	
	//对checkbox的选中数量进行校验[v_mincheckbox-max]例如:v_mincheckbox-2 checkbox的选择数量不能小于2
	['v_mincheckbox',
		function() 
		{
			return "最少需要选择其中"+ arguments[1] +"项；";
		},
		function(elm) 
		{
			var elm = $(elm);
			var str = 0;
			var sName = elm.name;
			if(!Magic_validation.get('required').test(elm))
			{
				return true;
			}
			var checkForm = $("form").filter(this + " " + elm)[0];
			$("input[@name=" + sName + "]",checkForm).each(function(){
				if(this.checked == true ){
					str ++;
				}
			});
			return (str >= arguments[1])? true : false;
		}],	
	//对文件类型进行校验[v_file-type1-type2]例如:v_file-jpg-gif-png文件类型限定在jpg gif png格式
	['v_file',
		function() 
		{
			var str="";
			for( var i = 1; i< arguments.length; i++)
			{
				str = i > 1 ? str + "," : str;
				str = str + arguments[i];
			}
			return "只能上传后缀名为"+ str +"的文件；";
		},
		function(elm) 
		{
			if(!Magic_validation.get('required').test(elm))
			{
				return true;
			}
			var str = elm.value;
			var str = str.split(".").pop();
			if(!str) 
			{
				return false;
			}
			for( var i = 1; i < arguments.length; i++)
			{
				if(str.toLowerCase() == arguments[i])
				{
					return true;
				}
			}
			return false;
		}],	
	//字段最小长度校验[v_minlength-min-dlValue]例如:v_minlength-6长度不能小于6 v_minlength-6-dlValue dlValue是判断是否进行双子节计算
	['v_minlength',
		function(elm) 
		{
			var v = $(elm).val();
			var blen = blenlength(v,arguments[2]);
			var b = arguments[1];
			return arguments[2] != "doubleValue" ? ("长度不能小于" + b + "个字符，当前长度为" + blen + "；") : ("长度不能小于" + b + "个字符，当前长度为" + blen + "；");
		},
		function(elm) 
		{
			var v = $(elm).val();
			if(Magic_validation.get('IsEmpty').test(v))
			{
				return true;
			}
			var b = arguments[1];
			var blen = blenlength(v,arguments[2]);
			return (blen >= b)? true : false;
		}],			
	//字段最大长度校验[v_maxlength_max_dlValue]例如:v_maxlength-6长度不能小于6 v_maxlength-6-dlValue dlValue是判断是否进行双子节计算
	['v_maxlength',
		function(elm) 
		{
			var v = $(elm)[0].value;
			var blen = blenlength(v,arguments[2]);
			var b = arguments[1];
			return arguments[2] != "dlValue" ? ("长度不能大于" + b + "个字符，当前长度为" + blen + "；") : ("长度不能大于" + b + "个字符，当前长度为" + blen + "；");
		},
		function(elm) 
		{
			var v = $(elm)[0].value;
			//alert(v.length);
			if(Magic_validation.get('IsEmpty').test(v))
			{
				return true;
			}
			var b = arguments[1];
			var blen = blenlength(v,arguments[2]);
			return (blen <= b)? true : false;
		}],				
	//字段长度范围校验[v_rangelength-min-max-blValue]例如:v_rangelength-6-10长度在6-10之间 v_rangelength-6-10-dlValue dlValue是判断是否进行双子节计算
	['v_rangelength',
		function(elm) 
		{
			var v = $(elm).val();
			var blen = blenlength(v,arguments[3]);
			var a = arguments[1];
			var b = arguments[2];
			return arguments[2] != "dlValue" ? ("长度在" + a + "-" + b + "个字符之间，当前长度为" + blen + "；") : ("长度在" + a + "-"+ b +"个字符之间，当前长度为" + blen + "；");
		},
		function(elm) 
		{
			var v = $(elm).val();
			if(Magic_validation.get('IsEmpty').test(v))
			{
				return true;
			}
			var a = arguments[1];
			var b = arguments[2];
			var blen = blenlength(v,arguments[3]);
			return ( a <= blen && blen <= b)? true : false;
		}],
	//字段最小值校验[v_minnumber-min]例如:v_min-6最小值不能小于6
	['v_minnumber',
		function() 
		{
			return "最小值不能小于" + arguments[1] + "；";
		},
		function(elm) 
		{
			var v = $(elm).val();
			if(Magic_validation.get('IsEmpty').test(v))return true;
			var str = v/1;
			var a = arguments[1]/1;
			return ( str >= a )? true : false;
		}],
	//字段最大值校验[v_maxnumber-max]例如:v_max-10最大值不能大于10
	['v_maxnumber',
		function() 
		{
			return "最大值不能大于" + arguments[1] +"；";
		},
		function(elm) 
		{
			var v = $(elm).val();
			if(Magic_validation.get('IsEmpty').test(v))
			{
				return true;
			}
			var str = v/1;
			var a = arguments[1]/1;
			return ( str <= a )? true : false;
		}],
	//字段值范围校验[v_rangenumber-min-max]例如:v_range-6-10值在6-10之间
	['v_rangenumber',
		function()
		{
			return "值必须在" + arguments[1] + "-" + arguments[2] + "之间；";
		},
		function(elm) 
		{
			var v = $(elm).val();
			if(Magic_validation.get('IsEmpty').test(v))
			{
				return true;
			}
			var str = v/1;
			var a = arguments[1]/1;
			var b = arguments[2]/1;
			return ( a <= str <= b )? true : false;
		}],
	//字段值一致性校验[v_equals-otherInputFieldId]例如:v_equals-agio_price 判断当前字段和agio_price字段的一致性(可以判断多个字段的一致性)
	['v_equals',
		function() 
		{
			var str="";
			for( var i = 1; i < arguments.length; i++)
			{
				str = i > 1 ? str + "、" : str;
				str = str + $("#" + arguments[i])[0].title ;
			}
			return "值必须和" + str + "的值保持一致；";
		},
		function(elm) 
		{
			var v = $(elm).val();
			for( var i = 1; i < arguments.length; i++)
			{
				if(v != $("#" + arguments[i]).val())
				{
					return false;
				}
			}			
			return true;
		}],
	//字段值不一致性校验[v_unequals-otherInputFieldId]例如:v_unequals-agio_price 判断当前字段和agio_price字段的一致性(可以判断多个字段的一致性)
	['v_unequals',
		function() 
		{
			var str="";
			for( var i = 1; i < arguments.length; i++)
			{
				str = i>1 ? str + "、" : str;
				str = str + $("#" + arguments[i])[0].title ;
			}
			return "值不能和" + str + "的值相同；";
		},
		function(elm) 
		{
			var v = $(elm).val();
			return Magic_validation.get('IsEmpty').test(v) || !Magic_validation.get('v_equals').test.apply(this,arguments);
		}],
	//字段值大小比较校验[v_lessthan-otherInputFieldId]例如:v_lessthan-agio_price 对比当前字段和agio_price大小(可以对比多个字段的一大小)
	['v_lessthan',
		function() 
		{
			var str="";
			for( var i = 1; i < arguments.length; i++)
			{
				str = i>1 ? str + "、" : str;
				str = str + $("#" + arguments[i])[0].title ;
			}
			return "值不能大于" + str + "的值；";
		},
		function(elm) 
		{
			var v = $(elm).val()/1;
			for( var i = 1; i < arguments.length; i++){
				if(v > $("#" + arguments[i]).val()/1)
				{
					return false;
				}
			}
			return true;
		}],
	//字段值大小比较校验[v_greatthan-otherInputFieldId]例如:v_greatthan-agio_price 对比当前字段和agio_price大小(可以对比多个字段的一大小)
	['v_greatthan',
		function() 
		{
			var str="";
			for( var i = 1; i < arguments.length; i++)
			{
				str = i>1 ? str + "、" : str;
				str = str + $("#" + arguments[i])[0].title ;
			}
			return "值不能小于" + str + "的值；";
		},
		function() 
		{
			var v = $(elm).val()/1;
			for( var i = 1; i < arguments.length; i++)
			{
				if( v < $("#" + arguments[i]).val()/1)
				{
					return false;
				}
			}
			return true;
		}],
	//字段选填[v_getone-otherInputFieldId]例如：v_getone-phone 当前字段和phone字段两个必须填一个(可以多个字段的选填)
	['v_getone',
		function(elm) 
		{
			var str=$(elm)[0].title;
			for( var i = 1; i < arguments.length; i++)
			{
				str = str + "、"+ $("#" + arguments[i])[0].title ;
			}
			return str + "必填其一；";
		},
		function(elm) 
		{
			if(!Magic_validation.get('IsEmpty').test($(elm).val())){
				return true;
			}
			for( var i = 1; i < arguments.length; i++)
			{
				if(!Magic_validation.get('IsEmpty').test($("#" + arguments[i]).val()))
				{
					return true;
				}
			}
			return false;
		}],
	//对字段的校验自定义模板[v_pattern]例如:<input type="text" class="v_pattern" value="" pattern="/apple/i" patternMsg="内容里面必须包含apple；" /> 自定义正则进行判断
	['v_pattern',
		function(elm) 
		{
			return $(elm).attr('patternMsg') ? $(elm).attr('patternMsg') : "输入的值不匹配；";
		},
		function(elm) 
		{
			if(/\/(\S*)\/(\S*)?/.test($(elm).attr('pattern')))
			{
				return new RegExp(RegExp.$1,RegExp.$2).test($(elm).val());
			}
			return true;
		}],
	//对字段的校验自定义模板[v_pattern]例如:<input type="text" class="v_pattern" value="" pattern="/apple/i" patternMsg="内容里面必须包含apple；" /> 自定义正则进行判断
	['v_username',
		function()
		{
			return "不能填写下列字符（,.<>?/\'\"()*&^%$#!~|\\）";
		},
		function (elm) 
		{
			var v = $(elm).val();
			return Magic_validation.get('IsEmpty').test(v) ||  !/[,.<>\?\/'"\(\)\*&^%$#!~\|\\]/.test(v);
		}]
		
]);

//全码转换半码长度算法
function blenlength(sString,doubleValue){
	var str = sString;
	var blen = 0;
	/*
	if(doubleValue !="dlValue" && str.length < 800)
	{
		//alert("2");
		for(i=0; i<str.length; i++) 
		{
			if (((str.charCodeAt(i) & 0xff00) != 0) && doubleValue != "dlValue") 
			{
				blen ++;
			}
			blen ++;
		}
	}
	else
	{
		//alert("1");
		blen = str.length;
	}
	*/
	return str.length;
}
