/**
* @author Laurent Dinclaux <laurent.dinclaux@gmail.com>
* @since  Monday Jul 18 2006
*/
Element.extend({
 	hide : function () {
		this.setStyle('display','none').setOpacity(0);
	},
	
	show : function () {
		this.setStyle('display','block').setOpacity(100);
	},
	update : function (html) {
		this.setHTML(html);
	}
});

var GeckaHttpr =  new Class(
{
	
	objThis : this,

	form 			:null,
	httprResultDiv 	: null,
	httprStatusDiv 	: null,
	onFormValid    	: {},
	onAfterDone     : {},

	scrollTo 		: 0,
	
	response : {},
	
  	initialize: function (form, httprResultDiv, httprStatusDiv,  onFormValid, onAfterDone ) {
  	
  		this.form 				= $(form);
		this.httprResultDiv 	= httprResultDiv 	? $(httprResultDiv) 	: $('httprResult');
		this.httprStatusDiv 	= httprStatusDiv	? $(httprStatusDiv) 	: $('httprStatus');
		this.onFormValid    	= onFormValid ? onFormValid : function(){};
		this.onAfterDone      	= onAfterDone ? onAfterDone : function(){};
				
						
		window.addEvent('domready',  function() {
			
			this.httprResultDiv.hide();
			this.httprStatusDiv.hide();
			
			this.form.addEvent('submit',  this.submit.bindAsEventListener(this));
		}.bind(this) );
	},


	/**
	* Call this one to submit your form
	*/
	submit : function (event) {
		new Event(event).stop();
		
		// hide result div
		this.httprResultDiv.hide();
		this.httprResultDiv.scrollTo();

		// httpr_status
		this.httprStatusDiv.setHTML('Chargement ...');
		this.httprStatusDiv.show();

		// scroll top
		//scroll(0,this.scrollTo);

		
		// disable form
		//this.form.disable();

		// build query string from form
		var data = this.form.toQueryString() + '&HTTPR=1';

		//clear errors
		this.clear_form_errors(this.form);

		// get form method
		var formMethod = this.form.method;
		var method = formMethod.toLowerCase();

		var myAjax = new Ajax( this.form.action+ '/JHR',
										{
											method: method,
											data: data,
											onSuccess: this.handler.bind(this)
										}).request();
	
	},

	// XHR handler
	handler : function(httpr) {
		
		json = Json.evaluate(httpr, true);	
		
			//hack to get json from rersponseText and bnot X-JSON header
			if(!json) json = httpr.responseText ? httpr.responseText.evalJSON(true) : null;
						
			if( json ) {
				
				/**
				 * status repport errors occured
				 */
				if( json.status != 1 ) {
					
					this.show_form_errors (json.errors);
					this.httprStatusDiv.update('Chargé.');
					//this.form.enable();
					this.httprStatusDiv.hide();
	
				}
	
				//  no error, redirect to user list
				else {
					this.httprStatusDiv.update('Traitement en cours. Patientez.');
					this.onFormValid(this);
	
				}
	
	
			}
			else {
				
				this.httprStatusDiv.update('Erreur. Réessayez.');
				//this.form.enable();
	
			}
		
		
		this.onAfterDone(this);

	},

	// show form errors
	show_form_errors : function (errors) {
		
		// display errors using DOM
		var errt 	= document.createElement('STRONG');
		var errtt 	= document.createTextNode('Erreur(s):');
		errt.appendChild(errtt);
				
		var domerr 	= document.createElement('UL');
		

		errors.each(

			function(error) {
				/* create error list */
				var container 	= document.createElement('LI');
				
				container.innerHTML = error.message;
				domerr.appendChild(container);

				/* set fields class names */
				var fields = error.fields;
				var fields_on_error = fields.split(',');
				
				fields_on_error.each( function(fieldID) {
											  
					if(field = $(fieldID)) field.addClass('errorField');
				});
			}
		);

		// show errors
		this.httprResultDiv.appendChild(errt);
		this.httprResultDiv.appendChild(domerr);
		this.httprResultDiv.show();
		
		var winScroller = new Fx.Scroll(window, {
		wait:false,
		offset: {'y': -70},
		transition: Fx.Transitions.Quad.easeInOut
	});
	winScroller.toElement(this.httprResultDiv);

		this.httprStatusDiv.update('Chargé.');
	},
	

	clear_form_errors : function (form) {

		// clear previous error messages
		this.httprResultDiv.hide();
		this.httprResultDiv.setHTML('');

		// clear classname from error fields
		if( form.elements ) {
			for(var i=0; i<form.elements.length; i++) {
				/* set fields class names */
				var field = $(form.elements[i]);
				field.removeClass('errorField');
				
			}
		}
	}
	}
	
 );
