
/**
 * Classe Wizard, permet de gérer un wizard en ajax
 * 
 * @param conf.controller
 * @param conf.nextStepAction
 * @param conf.previousStepAction
 * 
 */
function Wizard(conf){
	
	var self = this;

	if(conf.classPreffix != 'undefined'){
		this.classPreffix = conf.classPreffix;
	}else{
		this.classPreffix = '';
	}
	this.tabClass 						= this.classPreffix + 'wizard_tab';				//classe CSS des onglets
	this.currentTabClass 				= this.classPreffix + 'wizard_tab_current';		//classe CSS de l'onglet courant
	this.currentTabContainerClassPrefix	= this.classPreffix + 'step_'					//classe 
	this.tabIdPreffix 	 				= this.classPreffix + 'wizard_tab_';			//preffix de le l'attribut id des onglets
	this.disabledButtonClass 			= this.classPreffix + 'wizard_disable';			//classe CSS des boutons désactivés
	this.previousButtonId				= this.classPreffix + 'wizard_previous_button';	//valeur de l'attribut id du bouton "Retour"
	this.nextButtonId					= this.classPreffix + 'wizard_next_button';		//valeur de l'attribut id du bouton "Continuer" 
	this.wizardStepContentId			= this.classPreffix + 'wizard_step_content';	//classe CSS de la zone dans la quelle est chargé le contenu des étapes
	this.wizardStepButtonClass			= this.classPreffix + 'wizard_step_button';		//classe CSS des boutons Continuer et Retour	

	/**
	 * se charge de mettre à  jour les onglets
	 */
	this.updateTabs = function(currentStepId){
		$('.' + this.tabClass).removeClass(this.currentTabClass);
		//changement d'onglet courant
		var currentTabSelector = '#' + this.tabIdPreffix + currentStepId;
		$(currentTabSelector).addClass(this.currentTabClass);
		
		//changement de la classe de l'onglet parent
		$(currentTabSelector).parent().parent().attr('class',  
				this.currentTabContainerClassPrefix + currentStepId);
	};
	
	/**
	 * se charge d'activer ou desactiver les boutons
	 */
	this.enableButton = function(button, isEnable){
		if(isEnable){
			button.removeClass(this.disabledButtonClass);
			//button.unbind('click');
			//button.click(this.changeStepButtonAction);
		}else{
			button.addClass(this.disabledButtonClass);
			//button.unbind('click');
			//button.click(function(){ return false });
		}
		button.unbind('click');
		button.click(this.changeStepButtonAction);
	};
	
	/**
	 * Met à  jour le contenu 
	 */
	this.updateContent = function(html){
		var stepContentSelector = '#' + self.wizardStepContentId;
		var found = $('<div>' + html + '</div>').find(stepContentSelector);
		if(found.length){
			if($.browser.msie){
				$(stepContentSelector).html(found.html());
			}else{
				$(stepContentSelector).fadeOut('slow', function(){
					$(stepContentSelector).html(found.html());
					$(stepContentSelector).fadeIn('slow');
				});
			}	
			/* 
			$(stepContentSelector).hide( function(){
				$(stepContentSelector).html(found.html());
				$(stepContentSelector).show();
			});			
			*/		
		}	
	}
	
	/**
	 * Rafraichi la vue du wizard en fonction des infos dans l'objet json passé 
	 * en parametre les elements attendus dans le json sont :
	 * 
	 * isPreviousButtonEnabled 	: booleen à  true si le bouton Retour est actif
	 * isNextButtonEnabled		: booleen à  true si le Continuer Retour est actif
	 * currentStepId			: index de l'étape courante
	 * content					: contenu html du wizard
	 */
	this.refresh = function(json){
		if (json.redirect == 'undefined' || json.redirect == null) {
			//met à  jour les boutons
			self.enableButton($('#' + wizard.previousButtonId), json.isPreviousButtonEnabled);
			self.enableButton($('#' + wizard.nextButtonId), json.isNextButtonEnabled);
			
			//met à  jour les onglets
			self.updateTabs(json.currentStepId);
			
			//met à  jour le contenu
			self.updateContent(json.content);
		} else {
			window.location = json.redirect;
		}
	}
	
	this.redirectPaiement = function(json){
		if( typeof(json) == 'string' ){
			window.location = json;
		}else{
			if (json.redirect == 'undefined' || json.redirect == null) {
				//met à  jour les boutons
				self.enableButton($('#' + wizard.previousButtonId), json.isPreviousButtonEnabled);
				self.enableButton($('#' + wizard.nextButtonId), json.isNextButtonEnabled);
				
				//met à  jour les onglets
				self.updateTabs(json.currentStepId);
				
				//met à  jour le contenu
				self.updateContent(json.content);
			} else {
				window.location = json.redirect;
			}
		}
	}
	
	/**
	 * Execute l'action passé en parametre et met à  jour le wizard
	 */
	this.changeStep = function(urlAction){
		//si il existe des formulaires dans la zone de contenu, on récupère les valeurs des
		//champs pour les passer en parametre à  la requete
		var data = $.makeArray();
		
		var constructData = function(){
			var form = $(this);
			data = $.merge(data, form.serializeArray());
		}
		
		$('#' + this.wizardStepContentId).find('form').each(constructData);
		
		var conf = {
				url: urlAction,
				data : data,
				success: this.refresh
		};
		
		if( $('input#wg_card_payment').is(':checked') ){ //Si paiement par CB
			conf.success = this.redirectPaiement;
		}
		//core correspond au controller javascript et et déclaré dans commun.js
		core.ajax(conf);
		return false;
	};

	/**
	 * Action attachée aux boutons pour changer d'étape
	 */
	this.changeStepButtonAction = function(){
		var button = $(this);//lien <a>
		return self.changeStep( button.attr('href') );
	}
	
	/**
	 * initialise le wizard
	 */
	this.init = function(){
		//ajout des actions sur les boutons continuer et suivant
		$('.' + this.wizardStepButtonClass).click(this.changeStepButtonAction);
	}

}
