/*
 * jQuery inputvalidate plug-in v1.2.3
 * author: haoyu
 */
jQuery.fn.validate = function(){
		this.submit(function(){
			return valid(this);
		})
		
		function getErrmsg(key)
		{
			var msg ={
			required:"请回答下边的问题。",
			email:"请填写有效的邮件地址。",
			digits:"此项只能填写数字。",
			maxChoice:"此问题最多允许选{0}项。",
			minChoice: "此问题需要最少选{0}项。",
			maxLength:"此项不能多于{0}个字符。",
			minLength: "此项不能少于{0}个字符。",			
			date:"请按照yyyy-mm-dd填写日期，如1949-10-1。"
			};
			var val=0;
			if(arguments.length   ==   2)   
			{
				val=arguments[1];
			}
			if(val==0)
				return msg[key];
			else
				return msg[key].replace(new RegExp("\\{0\\}"), val);
		}

		
		function valid(form)
		{
			var ret=true;
			var validret={};
			var checkedbuffer=[];	
			$("select[@name^='question'],input[@name^='question'],textarea[@name^='question']",form).each(function(){
				var name = $(this).attr('name')
				
				if(checkedbuffer[name]!=1)
				{
					checkedbuffer[name]=1;
					//choice
					if(checkable(this))
					{
						validret = validate_choice(this)
						if(validret.err)
						{
							showError(this,validret.message);
							ret = false;									
						}
						else
						{
							hideError(this);
						}							
					}
								
					//blank
					if(this.nodeName.toLowerCase()=="input" && this.type=="text")
					{
						validret = validate_blank(this)
						if(validret.err)
						{
							showError(this,validret.message);
							ret = false;									
						}
						else
						{
							hideError(this);
						}
					}
					//textarea				
					if(this.nodeName.toLowerCase()=="textarea")
					{
						if($(this).metadata().required && jQuery.trim($(this).val())=="")
						{
							showError(this);
							ret = false;									
						}
						else
						{
							hideError(this);
						}
					}					
				}				
		    	
				
			});
			if(ret)
			{
				$("input[@type='image']",form).each(function(){
					$(this).click(function(){return false;});
				});				
			}

			return ret;
		}

		function validate_choice(element)
		{
			var ret={};
			ret.err=false;
					
			$("input[name='"+element.name+"']").each(function(){
				if($(this).metadata().required && $("input[name='"+this.name+"']:checked").length==0)
				{
					ret.err=true;
					ret.message = getErrmsg('required');
				}	
				if($(this).metadata().minChoice>0 && $("input[name='"+this.name+"']:checked").length<$(this).metadata().minChoice)
				{
					
					ret.err=true;
					ret.message = getErrmsg('minChoice',$(this).metadata().minChoice);
				}
				if($(this).metadata().maxChoice>0 && $("input[name='"+this.name+"']:checked").length>$(this).metadata().maxChoice)
				{
					
					ret.err=true;
					ret.message = getErrmsg('maxChoice',$(this).metadata().maxChoice);
				}		
				//console.log($("input[name='"+this.name+"']:checked").length+':'+$(this).metadata().maxChoice)
			});
			return ret;				
		}
				
		function validate_selected(element)
		{
			var ret={};
			ret.err=false;
			$("select[name='"+element.name+"'],input[name='"+element.name+"']").each(function(){
				if($(this).metadata().required && $(this).val()=="")
				{
					ret.err=true;
					ret.message = getErrmsg('required');
				}
			});
			return ret;				
		}
		function validate_blank(element)
		{
			var ret={};
			ret.err=false;
			$("input[name='"+element.name+"']").each(function(){
				var tv=jQuery.trim($(this).val());
				if($(this).metadata().required && tv=="")
				{
					ret.err=true;
					ret.message = getErrmsg('required');
				}
				if($(this).metadata().maxLength>0 && tv.length>$(this).metadata().maxLength)
				{
						ret.err=true;
						ret.message = getErrmsg('maxLength',$(this).metadata().maxLength);							
				}
				if($(this).metadata().minLength>0 && tv.length<$(this).metadata().minLength)
				{
						ret.err=true;
						ret.message = getErrmsg('minLength',$(this).metadata().minLength);							
				}								
				if($(this).metadata().email && $(this).val()!="")
				{
					if(!/^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/i.test($(this).val()))
					{
						ret.err=true;
						ret.message = getErrmsg('email',100);							
					}

				}
				if($(this).metadata().digits && $(this).val()!="")
				{
					if(!/^\d+$/i.test($(this).val()))
					{
						ret.err=true;
						ret.message = getErrmsg('digits');							
					}

				}
				if($(this).metadata().date && $(this).val()!="")
				{
					if(!/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test($(this).val()))
					{
						ret.err=true;
						ret.message = getErrmsg('date');							
					}

				}							
			});
			return ret;			
		}
		function validcomplex(element)
		{
			var hasempty=false;
			//var options =jQuery("option:selected", this)[0];
			$("select[name='"+element.name+"'],input[name='"+element.name+"']").each(function(){
				//console.log("e:"+this.name+' '+this.type+' '+this.value)
				if($(this).metadata().required && $(this).val()=="")
				{
					hasempty=true;
				}
			});
			return hasempty;			
		}
		function hideError(element)
		{	
		    	if($("label").filter("[@for='err"+element.name+"']").length>0)
		    	{
		    		errlabel = $("label").filter("[@for='err"+element.name+"']");
					errlabel.hide();
		    	}			
		}
		
		function showError(element)
		{
			var msg=getErrmsg('required');
			if(arguments.length   ==   2)   
			{
				msg=arguments[1];
			}

	    	if($("label").filter("[@for='err"+element.name+"']").length==0)
	    	{
	    		errlabel = $("<label />").attr({"for":"err"+element.name, "class":"error"}).html(msg);
				var qdiv=$(element).parents('div')[0];
	    		$(qdiv).prepend(errlabel);
	    	}else
			{
				errlabel = $("label").filter("[@for='err"+element.name+"']");
				errlabel.html(msg)
				errlabel.show();
			}		
		}
		function checkable(element)
		{
			return /radio|checkbox/i.test(element.type);
		}
}
