// JavaScript Document
var Validator = Class.create(
{
	initialize:function(ele,options){
		this.ele = $(ele);
		this.handlers=[
			this.validRequiredField,
			this.validEmailField,
			this.validPasswordField,
			this.validUniqueField
		];
		this.is_stop=false;
		
	},
	valid:function(returnHandler){
		if(!returnHandler) returnHandler=Prototype.emptyFunction;
		document.fire("validator:beforeValidResult");
		
		$$(".validator-error").invoke("removeClassName","validator-error");
		
		if(this.is_stop) return true;
		var is_valid=true;
		var valid_return_count=this.handlers.length;
		
		this.handlers.each(
			function(h){
				h.bind(this)(function(r){
								 --valid_return_count;
								 if(is_valid && !r) is_valid=false;
								 if(valid_return_count==0) {
									returnHandler(is_valid);
									document.fire("validator:afterValidResult",is_valid);
								}
							  }.bind(this));
				
			}.bind(this)
		);
		return is_valid;
	},
	addValidHandler:function(handler){
		this.handlers.push(handler);
	},
	stopValid:function(){
		this.is_stop=true;
	},
	validRequiredField:function(returnHandler){
		var is_valid=true;
		
		this.ele.select("input.validator-required, textarea.validator-required").each(
			function(input){
				if(!input.disabled && input.visible() && !input.present()){
					is_valid=false;
					this.afterValidFail(input,this.ele.readAttribute("validator:error_msg_required"));
				}
			}.bind(this)
		);
		returnHandler(is_valid);
	},
	validEmailField:function(returnHandler){
		var  is_valid=true;
		this.ele.select("input.validator-email").each(
			function(input){
				if(!$F(input).isEmail() && input.present() && input.visible()){
					is_valid=false;
					this.afterValidFail(input,this.ele.readAttribute("validator:error_msg_email"));
				}
			}.bind(this)
		);
		returnHandler(is_valid);
		//return is_valid;
	},
	validPasswordField:function(returnHandler){
		var is_valid=true;
		var dict={};
		var input=null;
		this.ele.select("input.validator-password").each(
			function(input){
				if(!dict[input.name]){
					dict[input.name]=$F(input);
				}else{
					if(dict[input.name]!=$F(input) && input.visible()){
						is_valid=false;
						this.afterValidFail(input,this.ele.readAttribute("validator:error_msg_password"));
					}
				}
			}.bind(this)
		);
		returnHandler(is_valid);
		//return is_valid;
	},
	validUniqueField:function(returnHandler){
		var is_valid=true;
		//last_action = this.ele.action;
		//this.ele.action=this.ele.readAttribute("validator:exists_checking_url");
		var url = this.ele.readAttribute("validator:exists_checking_url");
		if(url){
			new Ajax.Request(
				this.ele.readAttribute("validator:exists_checking_url"),
				{
					parameters:this.ele.serialize(),
					asynchronous:false,
					onSuccess:function(t,r){
						this.ele.select(".validator-unique").each(
							function(input){
								if(r[input.readAttribute("name")]>0){
									is_valid=false;
									this.afterValidFail(input,this.ele.readAttribute("validator:error_msg_exists"));
									returnHandler(is_valid);
								}
							}.bind(this)
						);
						if(is_valid) returnHandler(true);
					}.bind(this)
				}
			);
		}else{
			returnHandler(true);
		}
		/*this.ele.request(
			{
				onSuccess:function(t,r){
					this.ele.select(".validator-unique").each(
						function(input){
							if(r[input.readAttribute("name")]>0){
								is_valid=false;
								this.afterValidFail(input,this.ele.readAttribute("validator:error_msg_exists"));
								returnHandler(is_valid);
							}
						}.bind(this)
					);
					if(is_valid) returnHandler(true);
				}.bind(this)
			}
		);
		this.ele.action=last_action;*/
	},
	observe:function(eventname,handler){
		document.observe("validator:"+eventname,handler);
	},
	afterValidFail:function(input,msg){
		input.addClassName("validator-error");
		document.fire("validator:afterValidFail",{input:input,msg:msg});
	},
	submit:function(){
		if(this.valid())
			this.ele.submit();
	},
	request:function(ajaxOptions){
		if(this.valid()){
			this.ele.request(ajaxOptions);
		}
	}
}
);
Component.init("form.validator","Validator");