/**
* @author Laurent Dinclaux <laurent.dinclaux@gmail.com>
* @since  Monday Jul 18 2006
*/

var GeckaHttpr = Class.create();
GeckaHttpr.prototype = {
	
	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 : {};
		this.onAfterDone      	= onAfterDone ? onAfterDone : {};
				
		
				
		Event.observe(window, 'load', function() {
			this.httprResultDiv.hide();
			this.httprStatusDiv.hide();
			Event.observe(this.form, 'submit', this.submit.bindAsEventListener(this));
		}.bind(this) );
	},


	/**
	* Call this one to submit your form
	*/
	submit : function (event) {

		// hide result div
		this.httprResultDiv.hide();
		this.httprResultDiv.scrollTo();

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

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

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

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

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

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

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

	// XHR handler
	handler : function(httpr, json) {
	
		// case bad status code get returned, such as 404
		if( httpr.status != 200 ) {

			this.httprResultDiv.update("Error: " + httpr);
			this.httprResultDiv.show();
			
		}
		else {
		
			
		
			//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.addClassName('errorField');
				});
			}
		);

		// show errors
		this.httprResultDiv.appendChild(errt);
		this.httprResultDiv.appendChild(domerr);
		this.httprResultDiv.show();

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

	clear_form_errors : function (form) {

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

		// 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.removeClassName('errorField');
				
			}
		}
	}
}