/**
 * Objet javascript permettant de gérer les menus déroulants des nombres
 d'adultes et d'enfants de la page rooms-dates.jsp.
 */
var SelectPax = {
	
    bookingEngineViewBean: null,
    /**
     * Liste des noms d'objets à utiliser.
     */
		getBeans: function()
		{
        return "BookingEngineViewBean";
    },
    /**
     * Initialisation de la variable JSON
     */
    initJSON: function()
    {
      var num;
    	try {
        	for( num in beans)
        	{
            if("BookingEngineViewBean" == beans[num].nom)
            {
              bookingEngineViewBean = beans[num].bean;
            }
          }
        }
        catch(e)
        {
    		  alert(e);
        }
    },
    
    /**
     * Retourne la variable de classe instanciée.
     */
    getBookingEngineViewBean: function()
    {
        return bookingEngineViewBean;
    },
    
    
    /**
     * Ecrivez votre code sur l'initialisation des affichage de la page
     * ici.
     * Cette méthode est appelée sur le onload de la page.
     */
    rewrite: function()
    {
        this.observePax();
        this.checkPax("nb_personne", "nb_enfant");
        if($("type_carte_fidelite"))
        	Event.observe($("type_carte_fidelite"), "change", this.rewriteRoomNumber);

		if(navigator.userAgent.indexOf('Safari') != -1)
		{
			if($('type-couchage')) 
			{
				labels = $('type-couchage').select('label');
				for(var i=labels.length-1; i>=0; i--)
				{
					Event.observe($(labels[i]), "click", this.handleLabel);
				}
			}
		}		
    },
    
    /**
     * Ajout des observateur d'évènements sur les menus déroulants.
     */
    observePax: function()
    {
	    if($("nb_personne")) {
			Event.observe(
				$("nb_personne"),
				"change",
				function(event) { SelectPax.checkPax("nb_personne", "nb_enfant"); }
			    
			);
		}
		
		if($("nb_enfant")) {
			Event.observe(
				$("nb_enfant"),
				"change",
				function(event) { SelectPax.checkPax("nb_personne", "nb_enfant"); }
			);
		}
    },
    
    /**
     * Gestion des menus déroulants, on regarde si nbAdults + nbEnfant ne dépasse 
     * pas bookingEngineViewBean.hotelPaxPolicies.maxPax.
     */
    checkPax: function(adultsId, childId) {
        var adultsNb = eval($(adultsId).options[$(adultsId).selectedIndex].value);
        var childNb = 0
        var childBlockReady = $(childId);
        // Si l'on a une politique enfant, je met par défaut la politique enfant à 0.
        if(childBlockReady) {
            try {
                childNb = eval(childBlockReady.options[childBlockReady.selectedIndex].value);
            }
            // Une exception est levée dans le cas du premier affichage, car la liste n'existe pas encore.
            catch(ex) {
                alert(ex);
                childNb = 0;
            }
            
            // Je prends la plus petite des 2 valeurs que sont le nb max d'enfants de la chipol
            // et le nombre max d'enfants dans le reservable.
            var maxChilds = bookingEngineViewBean.hotelPaxPolicies.maxChildsChipol;
            if(bookingEngineViewBean.hotelPaxPolicies.maxChildsChipol > bookingEngineViewBean.hotelPaxPolicies.maxChildsInReservable)
                maxChilds = bookingEngineViewBean.hotelPaxPolicies.maxChildsInReservable;

            // test si l'on a des enfants, si oui, alors si il y a trop d'occupant, on les mets à 0 et
            // on change la taille de la liste.
            if( (adultsNb + childNb) > bookingEngineViewBean.hotelPaxPolicies.maxPax ) {
                // Remise à zéro de la liste.
                childBlockReady.length = 0;

                var size;
                // Si le nombre d'adultes est égal au max, il ne reste pas de place pour les enfants.
                if(adultsNb >= bookingEngineViewBean.hotelPaxPolicies.maxPax) {
                    size = 0;
                }
                else {
                    size = bookingEngineViewBean.hotelPaxPolicies.maxPax - adultsNb;
                }

                this.rewriteSelectChildren(childId, size, '0', '0');
                // Et on masque le bloc
                this.hideChildPolicy(size);
            }
            // Si le nombre d'enfants + le nombre d'adultes est supérieur au max, alors on recalcule
            // l'espace libre pour les enfants.
            else if((adultsNb + maxChilds) > bookingEngineViewBean.hotelPaxPolicies.maxPax) {
                childBlockReady.length = 0;
                var size = bookingEngineViewBean.hotelPaxPolicies.maxPax - adultsNb;
                this.rewriteSelectChildren(childId, size, '0', '0');
                this.hideChildPolicy(size);
                childBlockReady.selectedIndex = childNb;
            }
            // Si la taille de al select box des enfants est inférieure au nombre d'enfants alors
            // on recalcule la taille de la selectbox.
            else if(childBlockReady.length < maxChilds+1) {
                childBlockReady.length = 0;
                this.rewriteSelectChildren(childId, maxChilds, '0', '0');
                this.hideChildPolicy(maxChilds);
                childBlockReady.selectedIndex = childNb;
            }
            else {
                this.hideChildPolicy(maxChilds);
            }
        }

        // test si le nombre maximum d'adultes en serait pas supérieur au nombre maxpax de l'hôtel.
        if(bookingEngineViewBean.hotelPaxPolicies.maxAdults > bookingEngineViewBean.hotelPaxPolicies.maxPax) {
            if( adultsNb > bookingEngineViewBean.hotelPaxPolicies.maxPax) {
                $(adultsId).selectedIndex = bookingEngineViewBean.hotelPaxPolicies.maxPax;
            }
        }
    },


    /**
     * Mise à jour du select box du nombre d'enfant
     */
    rewriteSelectChildren: function(id, size, defaultValue, selectedValue) {
        var select = $(id);
        if(bookingEngineViewBean.hotelPaxPolicies && bookingEngineViewBean.hotelPaxPolicies.maxChildsChipol) {
            this.createOptions(select, 1, size, defaultValue, null, selectedValue);
        }
    },
    
    /**
     * Mise à jour d'un sélect qui n'est qu'une liste de chiffre (nombre de personnes, dates, ...).
     * select: le select à remplir.
     * start: la valeur de départ.
     * defaultValue: Sert pour l'option de position 0, c'elle ui est affichée en premier, et souvent on
     * veut voir afficher une valeur indiquant qu'il faut choisir. Si l'on veut voir afficher ce cas 
     * il faut passer la valeur à null ou '', si on en veut une il faut au moins passer ' '.
     * defaultText: valeur qui sera afficher de paire avec la defaultValue.
     * selectedValue: dans le cas d'un réaffichage, on veut peut être voir apparaitre la valeur 
     * précédemment sélectionnée.
     */
    createOptions: function(select, start, size, defaultValue, defaultText, selectedValue) {
        var startCounter = 0;
        var display = start ;
    	if(defaultValue) {
    	    if(!defaultText || '' == defaultText)
    	        defaultText = defaultValue;
    	    select.options[0]=new Option(defaultText, defaultValue);
            if(selectedValue == defaultValue)
                select.selectedIndex = 0;
            startCounter = 1;
        }
        
        for(var counter= startCounter ; counter < (size+startCounter); counter++ ) {
            select.options[counter] = new Option( display, display );
            if(selectedValue == display)
                select.selectedIndex = counter;
            
            display++;
    	}
    },
    
    /**
     * Méthode permettant de cacher le bloc ou se trouve le menu déroulant des enfants.
     */
    hideChildPolicy: function(nbChilds) {
        listDl = $("content").select("dl.nb_enfant");
        extraBottom = $("rooms-date-pax").select("span.extra-bottom")[0];
        if(nbChilds == 0) {
            $(listDl[0]).style.display="none";
            if(extraBottom) extraBottom.style.display = "block";
        }
        else {
             $(listDl[0]).style.display="block";
        }
    },
	
	handleLabel:function(event)
	{
		var label = Event.element(event);
		var idName = label.getAttribute("for");
		$(idName).checked = true;
		//alert(idName);
	},
	
	rewriteRoomNumber:function(event){		
		if($("rooms_nb") && $("rooms_nb").type=="select-one"){			
			var selectElement = $("rooms_nb");
			var selectValue = selectElement.value;
			//On force le nettoyage du select
			selectElement.options.length=0;
			selectElement.innerHTML="";
			for(var i=0; i<2; i++){
				var oOption = document.createElement('option');
				oOption.value = i+1;
				oOption.innerHTML = i;
				if(selectValue==(i+1))
					oOption.selected=true;
				selectElement.appendChild(oOption);										
			}
		}
	}
    
}

core.push(SelectPax);

/**
 * Mettez ci-dessous les méthodes utilisées par la page, utilisant le JSON.
 * Toute méthode n'ayant pas de rapport avec le JSON ne sera pas acceptée.
 */
