var Validation={
	timer:0,
	formFields:new Array(),
	modelName:"",
	submitId:"",
	formId:"",
	usernameRequest:"",
	emailRequest:"",
	usernameRequestResult:true,
	emailRequestResult:true,
	ajaxRequestUrl:"users",
	hideMessage:function(b){
		this.hideSubmitMessage();
		d=$("#"+b+"Error");
		if(d){
			d.html("");
			d.css("display","none")
			}
		},
showMessage:function(b,c){
	d=$("#"+b+"Error");
	if(d){
		d.html('<div class="error-message">'+c+"</div>");
		d.css("display","block")
		}
	},
hideSubmitMessage:function(){
	d=$("#SubmitError");
	if(d){
		d.html("");
		d.css("display","none")
		}
	},
add:function(b,c,f,g){
	if($("#"+b)){
		a=new Array(5);
		a.tag=b;
		a.message=c;
		a.rule=f;
		a.params=g;
		a.validates=true;
		a.doValidate=true;
		if(!this.formFields[b]){
			this.formFields[b]=new Array()
			}
			this.formFields[b].push(a);
		$("#"+b).blur(function(){
			Validation.validateTag(b)
			});
		$("#"+b).keyup(function(){
			if(Validation.timer){
				clearTimeout(Validation.timer)
				}
				Validation.timer=setTimeout(function(){
				Validation.validateTag(b)
				},1000)
			});
		$("#"+b).mouseup(function(){
			if(Validation.timer){
				clearTimeout(Validation.timer)
				}
				Validation.timer=setTimeout(function(){
				Validation.validateTag(b)
				},1000)
			})
		}
	},
init:function(g,b,f,c){
	this.modelName=c;
	this.formId=g;
	this.submitId=b;
	if($("#"+this.submitId)){
		$("#"+this.submitId).attr("disabled",false);
		$("#"+this.formId).submit(function(){
			validation=true;
			var j;
			for(j in Validation.formFields){
				if(Validation.formFields[j][0]){
					if(Validation.formFields[j][0]["tag"]){
						for(var h=0;h<Validation.formFields[j].length;h++){
							if(Validation.formFields[j][h]["doValidate"]){
								if(!Validation.doValidate(Validation.formFields[j][h]["tag"],Validation.formFields[j][h]["message"],Validation.formFields[j][h]["rule"],Validation.formFields[j][h]["params"])){
									validation=false;
									Validation.formFields[j][h]["validates"]=false;
									break
								}
							}
						}
					}
			}
		}
		if($("#"+Validation.formId)){
	if(validation==true){
		Validation.hideSubmitMessage();
		$("#"+Validation.submitId).attr("disabled",true);
		return true
		}else{
		Validation.showMessage(Validation.submitId,f);
		return false
		}
	}
return false
})
}
},
validateTag:function(b){
	validation=true;
	if(this.formFields[b]){
		for(i=0;i<this.formFields[b].length;i++){
			if(this.formFields[b][i]["doValidate"]){
				if(this.doValidate(this.formFields[b][i]["tag"],this.formFields[b][i]["message"],this.formFields[b][i]["rule"],this.formFields[b][i]["params"])==false){
					validation=false;
					break
				}
			}
		}
	}
return validation
},
doValidate:function(b,c,f,g){
	if(!this.validates(b,f,g,c)){
		this.showMessage(b,c);
		return false
		}else{
		this.hideMessage(b);
		return true
		}
	},
getValue:function(b){
	el=$("#"+b);
	val="";
	if(el){
		if(!el.attr("type")){
			e=el.find("input[type=radio]");
			if(e){
				e.each(function(c){
					r=$(this);
					if((r.attr("type")=="radio")&&(r.attr("checked"))){
						val=r.val()
						}
					})
			}
			if(!val){
			e=el.find("select");
			if(e){
				if(e.length==3){
					if((e.eq(0).val())&&(e.eq(1).val())&&(e.eq(2).val())){
						val=e.eq(0).val()+"-"+e.eq(1).val()+"-"+e.eq(2).val()
						}
					}else{
				if(e.length==5){
					if((e.eq(0).val())&&(e.eq(1).val())&&(e.eq(2).val())&&(e.eq(3).val())&&(e.eq(4).val())){
						val=e.eq(0).val()+"-"+e.eq(1).val()+"-"+e.eq(2).val()+" "+e.eq(3).val()+":"+e.eq(4).val()
						}
					}
			}
	}
}
}else{
	switch(el.attr("type")){
		case"checkbox":
			if(el.attr("checked")==true){
			val=1
			}
			break;
		case"select-one":case"select-multiple":
			if(el.val()){
			val=el.val()
			}
			break;
		default:
			if(el.val()){
			val=el.val()
			}else{
			if(el.text()){
				val=el.text()
				}
			}
		break
		}
	}
if(!val){
	if((window.CKEDITOR!=undefined)&&(window.CKEDITOR.instances[b]!=undefined)){
		val=window.CKEDITOR.instances[b].getData()
		}
	}
return val
}else{
	return false
	}
},
validates:function(id,rule,params,message){
	val=this.getValue(id);
	if(!val){
		if((rule=="required")){
			return false
			}else{
			if(rule!="confirmPassword"){
				return true
				}
			}
	}
switch(rule){
	case"between":
		return(((val.length)>=eval(params.param1))&&((val.length)<=eval(params.param2)))?true:false;
		break;
	case"comparison":
		if(isNaN(val)){
		return false
		}
		switch(params.param1){
		case"isgreater":case">":
			return(eval(val)>eval(params.param2))?true:false;
			break;
		case"isless":case"<":
			return(eval(val)<eval(params.param2))?true:false;
			break;
		case"greaterorequal":case">=":
			return(eval(val)>=eval(params.param2))?true:false;
			break;
		case"lessorequal":case"<=":
			return(eval(val)>=eval(params.param2))?true:false;
			break;
		case"equalto":case"==":
			return(eval(val)==eval(params.param2))?true:false;
			break;
		case"notequal":case"!=":
			return(eval(val)!=eval(params.param2))?true:false;
			break
			}
			break;
	case"datetime":
		r=/^(?:(?:(?:(?:(?:1[6-9]|[2-9]\\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(\/|-|\.|\x20)(?:0?2\1(?:29)))|(?:(?:(?:1[6-9]|[2-9]\d)?\d{2})(\/|-|\.|\x20)(?:(?:(?:0?[13578]|1[02])\2(?:31))|(?:(?:0?[1,3-9]|1[0-2])\2(29|30))|(?:(?:0?[1-9])|(?:1[0-2]))\2(?:0?[1-9]|1\d|2[0-8])))) ([01]\d|2[0-3])(:[0-5]\d){0,2}$/;
		return val.match(r);
		break;
	case"date":
		r=/^(?:(?:(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(\/|-|\.|\x20)(?:0?2\1(?:29)))|(?:(?:(?:1[6-9]|[2-9]\d)?\d{2})(\/|-|\.|\x20)(?:(?:(?:0?[13578]|1[02])\2(?:31))|(?:(?:0?[1,3-9]|1[0-2])\2(29|30))|(?:(?:0?[1-9])|(?:1[0-2]))\2(?:0?[1-9]|1\d|2[0-8]))))$/;
		return val.match(r);
		break;
	case"time":
		return val.match(/^([01]\d|2[0-3])(:[0-5]\d){0,2}$/);
		break;
	case"boolean":
		return val.match(/^0|1$/);
		break;
	case"decimal":
		return val.match(/^[-+]?[0-9]*\.{1}[0-9]+(?:[eE][-+]?[0-9]+)?$/);
		break;
	case"email":
		return this.validEmail(val);
		break;
	case"equalTo":
		return(val==params.param1)?true:false;
		break;
	case"extension":
		return val.match(params.param1);
		break;
	case"ip":
		return val.match(/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/);
		break;
	case"minLength":
		return(val.length<params.param1)?false:true;
		break;
	case"maxLength":
		return(val.length>params.param1)?false:true;
		break;
	case"length":
		return(val.length==params.param1);
		break;
	case"numeric":
		return val.match(/^[-+]?[0-9]*\.{1}[0-9]+(?:[eE][-+]?[0-9]+)?$/);
		break;
	case"phone":
		return val.match(/^\+[0-9]{11}$/);
		break;
	case"postal":
		return val.match(/^[0-9]{2}-[0-9]{3}$/);
		break;
	case"range":
		if(isNaN(val)){
		return false
		}
		return((eval(val)>eval(params.param1))&&(eval(val)<eval(params.param2)))?true:false;
		break;
	case"inList":
		return val.match(params.param1);
		break;
	case"username":
		return val.match(/^[a-zA-Z0-9_]*$/);
		break;
	case"alpha":
		return val.match(/^[a-zA-Z]*$/);
		break;
	case"alphanumeric":
		return val.match(/^[a-zA-Z0-9]*$/);
		break;
	case"int":
		return val.match(/^[0-9]+$/);
		break;
	case"float":
		return val.match(/[0-9]+\.[0-9]+$|^[0-9]+$/);
		break;
	case"tags":
		return val.match(/^[ ]*[\w ,]*[ ]*$/);
		break;
	case"required":
		return val;
		break;
	case"checked":
		return val;
		break;
	case"selected":
		return val;
		break;
	case"custom":case"regex":
		return val.match(params.param1);
		break;
	case"url":
		return val.match(/^(?:(?:https?|ftps?|file|news|gopher):\/\/)?(?:(?:(?:25[0-5]|2[0-4]\d|(?:(?:1\d)?|[1-9]?)\d)\.){3}(?:25[0-5]|2[0-4]\d|(?:(?:1\d)?|[1-9]?)\d)|(?:[0-9a-z]{1}[0-9a-z\-]*\.)*(?:[0-9a-z]{1}[0-9a-z\-]{0,62})\.(?:[a-z]{2,6}|[a-z]{2}\.[a-z]{2,6})(?::[0-9]{1,4})?)(?:\/?|\/[\w\-\.,@?^=%&:;\/~\+#]*[\w\-\@?^=%&\/~\+#])$/i);
		break;
	case"uniqueUsername":
		return this.uniqueUsername(id,message);
		break;
	case"uniqueEmail":
		return this.uniqueEmail(id,message);
		break;
	case"confirmPassword":
		return this.confirmPassword(id);
		break;
	case 'password':
		return val.match(/^.*(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$/);
		break;
	default:
		try{
		eval("this.rule="+rule);
		return this.rule(id,params,message)
		}catch(err){}
		return true;
		break
		}
	},
validEmail:function(c){
	if(c.length<=0){
		return true
		}
		var h=c.match("^(.+)@(.+)$");
	if(h==null){
		return false
		}
		if(h[1]!=null){
		var g=/^\"?[\w-_\.]*\"?$/;
		if(h[1].match(g)==null){
			return false
			}
		}
	if(h[2]!=null){
	var f=/^[\w-\.]*\.[A-Za-z]{2,4}$/;
	if(h[2].match(f)==null){
		var b=/^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
		if(h[2].match(b)==null){
			return false
			}
		}
	return true
}
return false
},
uniqueUsername:function(b,c){
	el=$("#"+b);
	val=el.attr("value");
	if((val)&&(val!=this.usernameRequest)){
		this.usernameRequest=val;
		$.ajax({
			url:this.ajaxRequestUrl+"/check_username/"+val+"/",
			cache:false,
			success:function(f){
				if(f.match("err")){
					Validation.showMessage(b,c);
					Validation.emailRequestResult=false
					}else{
					Validation.hideMessage(b);
					Validation.emailRequestResult=true
					}
				}
		})
}else{
	return Validation.usernameRequestResult
	}
	return true
},
uniqueEmail:function(b,c){
	el=$("#"+b);
	val=el.attr("value");
	if((val)&&(val!=this.emailRequest)){
		this.emailRequest=val;
		$.ajax({
			url:this.ajaxRequestUrl+"/check_email/"+val+"/",
			cache:false,
			success:function(f){
				if(f.match("err")){
					Validation.showMessage(b,c);
					Validation.emailRequestResult=false
					}else{
					Validation.hideMessage(b);
					Validation.emailRequestResult=true
					}
				}
		})
}else{
	return Validation.emailRequestResult
	}
	return true
},
confirmPassword:function(b){
	if(($("#"+b).attr("value"))!=($("#"+this.modelName+"Password").attr("value"))){
		return false
		}
		return true
	},
turnOff:function(b,g){
	var f;
	for(f in this.formFields){
		if(Validation.formFields[f][0]){
			if(Validation.formFields[f][0]["tag"]){
				for(var c=0;c<Validation.formFields[f].length;c++){
					if((Validation.formFields[f][c]["tag"]==b)&&(Validation.formFields[f][c]["rule"]==g)){
						Validation.formFields[f][c]["doValidate"]=false
						}
					}
				}
		}
	}
},
turnOn:function(b,g){
	var f;
	for(f in this.formFields){
		if(Validation.formFields[f][0]){
			if(Validation.formFields[f][0]["tag"]){
				for(var c=0;c<Validation.formFields[f].length;c++){
					if((Validation.formFields[f][c]["tag"]==b)&&(Validation.formFields[f][c]["rule"]==g)){
						Validation.formFields[f][c]["doValidate"]=true
						}
					}
				}
		}
	}
}
};
