;(function($){
	$.fn.valForm=function(o,after){
		var t=$(this);
		t.find(":submit").removeAttr("disabled");
		t.bind("submit",function(e){
			var f=true;
			t.error=null;
			$.each(t.find("[v]"),function(i,n){
				var v=$(n);
				v.blur();
				var s=v.data("v");
				if(s=="init"||s=="error"||s=="ajax"){
					f=false;
					if(t.error==null){
						t.error=v;
					}
				}
			});
			if(o){
				if(!o()){
					f=false;
				}
			}
			if(!f){
				if(t.error){
					t.error.focus().blur();
				}
				if(e.preventDefault){
					e.preventDefault();
				}else{
					window.event.returnValue=false;
					return false;
				}
			}else{
				if(after&&!after()){
					if(e.preventDefault){
						e.preventDefault();
					}else{
						window.event.returnValue=false;
						return false;
					}
				}else{
					t.find(":submit").attr("disabled",true);
				}
			}
		});
	};
	$.fn.validate=function(o){
		var t=$(this);
		t.attr("v","true");
		t.data("v","init");
		t.o=$.extend({},$.v.d,o);
		t.data("o",t.o);
		t.bind({
			"focus":function(){
				t.o.help(t,t.o.info_help);
			},
			"blur":function(){
				if(t.val()!=t.temp){
					t.temp=t.val();
					$.v.validate(t);
				}else{
					$.v.show(t);
				}
			}
		});
	};
	$.v={
		validate:function(t){
			var o=t.data("o");
			var val=$.v.trim(t.val());
			var name=t.attr("name");
			if(o.before){
				if(o.before()){
					$.v.set(t,"valid","valid");
					return;
				}
			}
			if(o.req){
				if(val.length==0){
					$.v.set(t,"error","req");
					return;
				}
			}else{
				if(val.length==0){
					$.v.set(t,"valid","valid");
					return;
				}
			}
			if(o.len){
				if(o.len.length==1&&val.length!=o.len[0]){
					$.v.set(t,"error","len_eq");
					return;
				}else if(o.len.length==2&&(o.len[0]==0&&val.length>o.len[1])){
					$.v.set(t,"error","len_lt");
					return;
				}else if(o.len.length==2&&(val.length<o.len[0]||val.length>o.len[1])){
					$.v.set(t,"error","len_in");
					return;
				}
			}
			if(o.reg){
				if(!$.v.regex[o.reg]().test(val)){
					$.v.set(t,"error","reg");
					return;
				}
			}
			if(o.relate){
				if(o.relate.show){
					if(!o.relate.handle()){
						$.v.set(t,"error","relate");
						return;
					}
				}else{
					if(!o.relate.handle()){
						$.each(o.relate.fields,function(i,n){
							var info=n.data("v");
							if(info!="init"){
								$.v.set(n,"error","relate");
							}
						});
					}else{
						$.each(o.relate.fields,function(i,n){
							var info=n.data("i");
							if(info=="relate"||info=="valid"){
								$.v.set(n,"valid","valid");
							}else if(n.data("v")!="init"){
								$.v.show(n);
							}
						});
					}
				}
			}
			if(o.url){
				$.v.set(t,"ajax","load");
				t.attr("readonly","true");
				$.ajax({
					url:o.url,
					async:false,
					data:$.extend({value:val,timestamp:new Date()},o.data),
					success:function(d, s){
						t.removeAttr("readonly");
						d=d.replace("\n","").replace("\r","");
						if(d!='true'){
							$.v.set(t,"error","ajax_false");
						}else{
							$.v.set(t,"valid","valid");
						}
					},
					error:function(x, s, e){
						$.v.set(t,"error","ajax_error");
					}
				});
				return;
			}
			if(o.remote){
				$.v.set(t,"ajax","load");
				t.attr("readonly","true");
				$.ajax({
					url:o.remote,
					async:false,
					data:$.extend({value:val,timestamp:new Date()},o.data),
					success:function(d, s){
						t.removeAttr("readonly");
						if(o.remoteHandle(d)){
							$.v.set(t,"error","ajax_false");
						}else{
							$.v.set(t,"valid","valid");
						}
					},
					error:function(x, s, e){
						$.v.set(t,"error","ajax_error");
					}
				});
				return;
			}
			$.v.set(t,"valid","valid");
		},
		set:function(t,s,i){
			t.data("v",s);
			t.data("i",i);
			$.v.show(t);
		},
		show:function(t){
			var so=t.data("o");
			so[t.data("v")](t,so["info_"+t.data("i")]);
		},
		trim:function(str){
			var reg=/^(\s|\u00A0|\u3000)+|(\s|\u00A0|\u3000)+$/g;
			return str.replace(reg,"");
		},
		d:{},
		regex:{}
	}
})(jQuery);
