//Form extensions for prototype.js

// **** Validator ****
// *******************

Form.Validator = Class.create({
	initialize: function(name,ops) {
		Form.Validator.validators[name]=this;
		this.name = name;
		this.onvalidext=null;
		this.onvinalidext=null;
		this.result=null;
		this.fadingObjectIDs=new Array();
		this.fileUpload=true;

		this.form=document.forms[name];
		new Insertion.Bottom(this.form,'<input type="hidden" name="sendingMode" value="ajax">');
		this.errorObjects=new Array();
		Event.observe(this.form,'submit',submitWrap(this));
		if (typeof(ops)!='undefined'){
			if (typeof(ops['onValid'])!='undefined') this.onvalidext=ops['onValid'];
			if (typeof(ops['onInvalid'])!='undefined') this.oninvalidext=ops['onInvalid'];
			if (typeof(ops['fadingObjectIDs'])!='undefined'){
				if (typeof(ops['fadingObjectIDs'])=='string') this.fadingObjectIDs[0]=ops['fadingObjectIDs'];
				else this.fadingObjectIDs=ops['fadingObjectIDs'];
			}
			if (typeof(ops['fileUpload'])!='undefined') this.fileUpload=ops['fileUpload'];
		}
		function submitWrap(fv){
			return function(){
				fv.submit();
			}
		}
	},
	submit:function(){
		var i,obj,fv=this,feltolteshiba=false;
		//halványítás
		for(i=0;i<fv.fadingObjectIDs.length;i++) 
			$(fv.fadingObjectIDs[i]).setOpacity(Form.Validator.FADE_LEVEL);
		//már létező error mezők elrejtése:
		while (fv.errorObjects.length>0){				
			obj=fv.errorObjects.pop();
			obj.innerHTML='';	
		}
		//küldés
		var files=this.form.getElementsBySelector('[type="file"]');
		if (files.length>0) {	//van fájl -> küldés rejtett iframen keresztül	
			this.form.sendingMode.value="iframe";
			if (!eval("window._requestFrame_"  + fv.name)) 
				new Insertion.Bottom(document.body,'<iframe style="display:none" name="_requestFrame_'  + fv.name + '" onload="Form.Validator.validators.' + fv.name + '.responseHandler(window._requestFrame_' + fv.name + '.document.body.innerHTML)"></iframe>');
 			this.form.target="_requestFrame_" + fv.name;
			this.form.submit();
		}
		else{					//nincs fájl -> küldés ajax technikával
			fv.form.request({
				onComplete:function(r){fv.responseHandler.call(fv,r.responseText)}
			});
		}
	},
	responseHandler: function(response){
		for(i=0;i<this.fadingObjectIDs.length;i++) $(this.fadingObjectIDs[i]).setOpacity(1);
		if (response=='') return;
		if (!response.isJSON()) {alert('Error: ' + response); return;}
		//alert(response);
		this.result=response.evalJSON();
		if (this.result.success==1) this.onValid();
		else this.onInvalid();
	},
	onValid: function(){
		if (this.onvalidext!=null) this.onvalidext.call(this,this.result);
	},
	onInvalid: function(){
		var obj;
		for (iname in this.result.errors){
			for (ecode in this.result.errors[iname]){
				if ((obj=$(iname + '_error'))==null){
					//if (iname=='__form') break;
					//else {alert(this.result.errors[iname][ecode]);continue;}
					alert(this.result.errors[iname][ecode]);continue;
				}
				this.errorObjects.push(obj);
				obj.innerHTML+=Form.Validator.ERROR_BEGIN_CODE + this.result.errors[iname][ecode] + Form.Validator.ERROR_END_CODE;
			}
		}
		this.clear();
		if (this.oninvalidext!=null) this.oninvalidext.call(this,this.result);
	},
	clear:function(){
		var img=this.form.getElementsBySelector('img[name=' + Form.Validator.CAPTCHA_ELEMENTS_NAME + ']');
		this.form.getElementsBySelector('input[type=' + Form.Validator.CAPTCHA_ELEMENTS_NAME + '], input[type=password]').invoke('clear');
		if (img.length>0) img[0].src=img[0].src;
	}
});

Form.Validator.FADE_LEVEL=0.4;
Form.Validator.CAPTCHA_ELEMENTS_NAME='captcha';
Form.Validator.ERROR_BEGIN_CODE=' - ';
Form.Validator.ERROR_END_CODE='<br/>';
Form.Validator.validators=new Array();

// **** Tip ****
// *************

Form.Tip = Class.create({
	initialize: function(name) {
		this.name=name;
		this.form=document.forms[name];
		var inputs=this.form.getElements();
		var iname;
		function wrapShow(obj,iname){return function(){obj.showTip(iname);}}
		function wrapHide(obj,iname){return function(){obj.hideTip(iname);}}
		for (var i=0;i<inputs.length;i++){
			if (typeof(inputs[i].readAttribute('tip'))=='string') iname=inputs[i].getAttribute('tip');
			else iname=inputs[i].name;
			Event.observe(inputs[i],'focus',wrapShow(this,iname));
			Event.observe(inputs[i],'blur',wrapHide(this,iname));
		}
	},
	showTip: function(iname){
		var obj;
		if ((obj=$(iname+'_tip'))==null) return;
		if (Form.Tip.HIDE_MODE==1) obj.style.visibility='visible';
		else if (Form.Tip.HIDE_MODE==2) obj.display='block'
	},
	hideTip: function(iname){
		var obj;
		if ((obj=$(iname+'_tip'))==null) return;
		if (Form.Tip.HIDE_MODE==1) $(iname+'_tip').style.visibility='hidden';
		else if (Form.Tip.HIDE_MODE==2) $(iname+'_tip').display='none';
	}
})

Form.Tip.HIDE_MODE=1; //1: use visibility property, 2: use display property;

Form.fill=function(form,data){
	var element,i,j;
	if (typeof(form)!='object') form=document.forms[form];
	for(name in data){
		if (typeof(form.elements[name])=='undefined') continue;
		element=form.elements[name];
		if (element.type.substr(0,6)=='select'){
			if (typeof(data[name][0])=='string') data[name]=new Array(data[name]);
			for (i=0;i<element.options.length;i++)
				for (j=0;j<data[name].length;j++){
					//alert(name + " : " + element.options[i].value + ":" + data[name][j]);
					if (element.options[i].value==data[name][j]) {
						element.options[i].selected="selected";break;
					}
				}
		}
		else if (element.type=='checkbox' || element.type=='radio'){
			if (typeof(data[name][0])=='undefined') data[name]=new Array(data[name]);
			if (typeof(element.value)=='undefined'){ //tömb
				for (i=0;i<element.length;i++)
					for (j=0;j<data[name].length;j++)
						if (element[i].value=data[name][j]) {element[i].checked="checked";break;}
			}
			else{
				for (j=0;j<data[name].length;j++)
					if (element.value=data[name][j]) {element.checked="checked";break;}
			}
		}
		else{
			element.value=data[name];
		}
	}
}