/*
	Class:    	AjaxForm
	Author:   	Pierre Hanselmann
	Website:    http://www.smallbiz.ch
	Version:  	0.1
	Date:     	12/10/2008
	Built For:  MooTools 1.2.0 and more
*/
var AjaxForm = new Class({
	
	//implements
	Implements: [Options, Events],

	//options
	options: {
		form: '',						//conteneur Form element
		log: '',						//conteneur Log element (Texte et erreurs de retour)
		labelErrorClass: 'labelError',	//Classe CSS pour les labels en erreurs
		inputErrorClass: '',			//Classe CSS pour les input en erreurs
		slide: '',						//Effet de slide pour afficher les erreurs
		slide_box: '',
		slide_box_effect: '',
		submitted: ''
	},
	
	//initialization
	initialize: function(options) {
		this.setOptions(options);							//set options
		this.submit_event();								//Gestionnaire pour l'évenement "submit"
		this.options.slide = new Fx.Slide(this.options.log);	//Slide pour message de retour
		if (this.options.slide_box!=''){
				this.options.slide_box_effect = new Fx.Slide(this.options.slide_box);
		}
		//this.options.slide.hide();
		this.options.log.fade('hide').slide('hide');
		this.options.submitted = false;
	},
	
	submit_event: function() {
		this.options.form.addEvent('submit', function(e) {
			/**
			* Prevent the submit event
			*/
			e.stop();
			var log = this.options.log.empty().addClass('ajax-loading');
			
			this.fireEvent('sendRequest');
			
			//Set the options of the form's Request handler.
			if (!this.options.submitted) {
				this.options.form.set('send', {
					onComplete: function(response) { 
						log.removeClass('ajax-loading');
						obj_response = JSON.decode(response);
						if (obj_response.event) {
							if (obj_response.success) {
								this.fireEvent('responseSuccess', obj_response);
							} else {
								this.display_errors(obj_response);
								this.fireEvent('responseError', obj_response);
							}
						} else {
							this.display_errors(obj_response);
						}
						this.options.submitted = false;
					}.bind(this),
					method: 'post'
				});

				this.options.submitted = true;
				this.options.form.send();
			}	
		}.bind(this));
	},
	
	display_errors: function (obj_response){
		//Création de l'effet SLIDE IN/OUT
        
		//Reset des style du forumulaire
		//this.reset_style();
		
		//Allume tous les champs en erreurs
		/*$each(obj_response.error_fields, function(error_field){
				if (this.options.form.getElement('#lbl_' + error_field)!=null){
						this.options.form.getElement('#lbl_' + error_field).addClass(this.options.labelErrorClass);
				}
		}.bind(this));*/
		
		//Affiche les erreurs dans la zone prévue à cet effet (Avec un effet de slide IN/OUT)
		var error_content = '';
		$each(obj_response.errors, function(error_message){
			error_content += error_message + '<BR>';
		});
		var message_content = '';
		if (obj_response.message){
				/*$each(obj_response.message, function(message){
					message_content += message + '<BR>';
				});*/
				message_content = obj_response.message;
		}
		this.options.log.set('html', error_content + message_content);
		
		//Montre la zone de retour
		if(this.options.slide_box!=''){
				this.options.slide_box.getParent().setStyle('height','auto');
		}
		//this.options.slide.slideIn();
		
		this.options.log.fade('in').slide('in');
		(function(){ this.options.log.fade('out').slide('out'); }).delay(5000, this);

	},
	
	reset_style: function () {
		$each(this.options.form.getElements('label'), function(formLabel){
			formLabel.removeClass(this.options.labelErrorClass);
		}.bind(this));
	},
	
	reset_values: function () {
		//Vide les inputs
		$each(this.options.form.getElements('input'), function(formInput){
			if (!formInput.hasClass('dontChangeValue')) {
				var typeInput = formInput.getProperty('type');
				if (typeInput == 'text') {
					formInput.value = '';
				}
			}
		}.bind(this));
		
		//Vide les textareas
		$each(this.options.form.getElements('textarea'), function(formTextArea){
			if (!formTextArea.hasClass('dontChangeValue')) {
				formTextArea.value = '';
			}
		}.bind(this));
	}

});
