/**
* @author Laurent Dinclaux <laurent.dinclaux@gmail.com>
* @since  Monday Jul 18 2006
*/
var gk_xhr_form_submit = Class.create();
gk_xhr_form_submit.prototype = {
	objThis : this,

	form 			:null,
	xhrResultDiv 	: null,
	xhrStatusDiv 	: null,
	onFormValid    : null,
	afterDone      : null,

	scrollTo 		: 0,
	
	response : {},
	
  	initialize: function (form, xhrResultDiv, xhrStatusDiv,  onFormValid, afterDone ) {
		this.form 			= $(form);
		this.xhrResultDiv 	= $(xhrResultDiv);
		this.xhrStatusDiv 	= $(xhrStatusDiv);
		this.onFormValid    = onFormValid;
		this.afterDone      = afterDone;
	},


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

		// hide result div
		this.xhrResultDiv.hide();

		// xhr_status
		this.xhrStatusDiv.update('Chargement ...');
		this.xhrStatusDiv.show();

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

		// build query string from form
		var data = this.form.serialize() + '&XHR=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,
										{
											method: method,
											parameters: data,
											onComplete: this.handler.bind(this)
										});
		
		//this.form.action = void(0);

	},

	// XHR handler
	handler : function(xhr) {

		// case bad status code get returned, such as 404
		if( typeof(xhr) == 'number' ) {

			this.xhrStatusDiv.update("Error: " + xhr);
			this.xhrStatusDiv.show();

		}

		/**
		 * Response is XML
		 */
		else if( xhr.responseXML != null && xhr.responseXML.documentElement != null) {

			// get response
			var response = xhr.responseXML.documentElement;

			// get form process status
			var status = response.getElementsByTagName('status')[0].firstChild.data;

			/**
			 * status repport errors occured
			 */
			if( status != 1 ) {

				this.show_form_errors (response);
				this.xhrStatusDiv.update('Chargé.');
				this.form.enable();
				this.xhrStatusDiv.hide();

			}

			//  no error, redirect to user list
			else {
				this.xhrStatusDiv.update('Traitement en cours. Patientez.');
				this.onFormValid(this);

			}


		}
		else {
			alert(xhr.responseText);
			this.xhrStatusDiv.update('Erreur. Réessayez.');
			this.form.enable();

		}
		this.afterDone(this);

	},

	// show form errors
	show_form_errors : function (response) {

		// get errors
		err = response.getElementsByTagName('error');

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

		for(var i=0; i<err.length; i++) {

			/* create error list */
			var container 	= document.createElement('LI');
			var theData 	= document.createTextNode(err[i].getElementsByTagName('message')[0].firstChild.nodeValue);
			container.appendChild(theData);
			domerr.appendChild(container);



			/* set fields class names */
			var fields = err[i].getElementsByTagName('field')[0].firstChild.nodeValue;
			var fields_on_error = fields.split(',');
			
			fields_on_error.each( function(fieldID) {
				if(field = $(fieldID)) field.addClassName('errorField');
			});
		}

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

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

	clear_form_errors : function (form) {

		// clear previous error messages
		this.xhrResultDiv.hide();
		this.xhrResultDiv.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');
				
			}
		}
	}
}

