/***************************************************************************************
 * 
 * COMBOS DE ROOMING PARA SNIPPETS.
 *
 * 1/ Funcionalidad:
 *    -> Carga los selects de rooming e interactua con ellos dando la 
 *	     posibilidad de seleccionar adultos y niños diferentes para 
 *	     cada habitación. 
 * 
 * 2/ Requisitos:
 *    -> Incluir el script de internacionalizacion.
 *	  -> Incluir el script de commons.js
 * 	  -> Incluir el código <span id="rooming"></span> en el snippet donde se
 *		 desee la funcionalidad.
 *	  -> Incluir la llamada inicial initRooming({numHab por defecto}) sobre 
 *		 rooming por defecto junto con la carga de la página.
 *
 * 3/ Ejemplo de utilizacion:
 *	  -> Snippet Valencia (http://www.).
 *
 * 4/ Versiones 
 *    -> Fichero: 0.0.1
 *    -> API: 0.0.1
 *
 ****************************************************************************************/


/************************************** CONSTANTS ***************************************/
var DEFAULT_ADULTS_SELECTED = 2;
var DEFAULT_CHILDS_SELECTED = 0;
var MAX_ROOMS = 5;
var NUM_MIN_ADULTS_BY_ROOM = 1;
var NUM_MAX_ADULTS_BY_ROOM = 3;
var NUM_MIN_CHILDS_BY_ROOM = 0;
var NUM_MAX_CHILDS_BY_ROOM = 2;
var NUM_MAX_PERSONS_BY_ROOM = 3;

var SEARCH_FORM_N_ROOMS_ELEMENT_NAME = 'nRooms';
var DEFAULT_N_ROOMS_ELEMENT_ID = 'rooms';
var DEFAULT_ROOM_ELEMENT_ID = 'rooming';
var NADULTS_ELEMENT_ID_PREFIX = 'nAdults';
var NCHILDS_ELEMENT_ID_PREFIX = 'nChilds';
var ROOMING_INFO_ELEMENT_ID = 'roomsInfo';


/************************************* GLOBAL VARS **************************************/
var selectedUserRoomingData = new Array();


/*************************************** OBJECTS ****************************************/
function RoomData(nAdults, nChilds) {
	this.nAdults = nAdults;
	this.nChilds = nChilds;
}


/************************************** FUNCTIONS ***************************************/
/* 
 * Initialize rooming with the nRooms. 
 */
function initRooming(nRooms) {
	printNRooms(nRooms);
	changeRooms(nRooms);
}

function initRooming(nRooms, overrideMinAdults, overrideMaxAdults, overrideMinChilds, overrideMaxChilds, overrideMaxPersons) {
    overridePersons(overrideMinAdults, overrideMaxAdults, overrideMinChilds, overrideMaxChilds, overrideMaxPersons);
    printNRooms(nRooms);
    changeRooms(nRooms);
}

function overridePersons(minAdults, maxAdults, minChilds, maxChilds, maxPersons) {
    if (minAdults != null) NUM_MIN_ADULTS_BY_ROOM = minAdults;
    if (maxAdults != null) NUM_MAX_ADULTS_BY_ROOM = maxAdults;
    if (minChilds != null) NUM_MIN_CHILDS_BY_ROOM = minChilds;
    if (maxChilds != null) NUM_MAX_CHILDS_BY_ROOM = maxChilds;
    if (maxPersons != null) NUM_MAX_PERSONS_BY_ROOM = maxPersons;
}

function printNRooms(nRooms) {
	var span = get(DEFAULT_N_ROOMS_ELEMENT_ID);
	if (span != null) {
		var html = '<select class="long3" id="nRooms" name="nRooms" onchange="changeRooms(this.value);">';
		for (var i=1; i<=MAX_ROOMS; i++) {
			html += '<option value="' + i + '" ';
			if (i==nRooms) html += 'selected';
			html += '">' + i;
			if (i==1) html += HABITACION;
			else html += HABITACIONES;
			html += '</option>';
		}
		html += '</select>';
		span.innerHTML = html;
	}else{ //ie6 not support filling the SELECT with the previous method
		var select = get(SEARCH_FORM_N_ROOMS_ELEMENT_NAME);
		if(select != null){
			for (var i=1; i<=MAX_ROOMS; i++) {
				select.options[select.length] = new Option(i + " " + ((i==1)?HABITACION:HABITACIONES), i);
			}
			select.options[nRooms-1].selected = true;
		}
	}
}
					
/* 
 * Change the number of rooms with nRooms. 
 */
function changeRooms(nRooms) {
	var roomElementId = DEFAULT_ROOM_ELEMENT_ID;

	if (isDefined(selectedUserRoomingData) && selectedUserRoomingData.length > 0) {
		nRooms = (selectedUserRoomingData.length-1);
		get(SEARCH_FORM_N_ROOMS_ELEMENT_NAME).value=nRooms;
	} else {
		nRooms = parseInt(nRooms);
	}
	var rooms = get(roomElementId);

	var userRoomingData = (isDefined(selectedUserRoomingData) && selectedUserRoomingData.length > 0)?selectedUserRoomingData:getRoomingUserInfo(roomElementId);
	rooms.innerHTML = "";
	var content = "";
	for (var i = 1; i <= nRooms; i++) {
		content+= createNewRoom(i, userRoomingData[i], roomElementId);
	}
	rooms.innerHTML = content;
}

/* 
 * Get the info of the room. 
 */
function getRoomingUserInfo(roomElementId) {
	var userRoomingData = new Array();
	for (var i = 1; i < MAX_ROOMS; i++) {
		var nAdults = get(getAdultElementIdFromPrefix(roomElementId, i));
		var nChilds = get(getChildElementIdFromPrefix(roomElementId, i));
		if (nAdults == null || nChilds == null) break; // no more rooms defined right now 
		userRoomingData[i] = new RoomData(nAdults.value, nChilds.value);
	}
	return userRoomingData;
}

/* 
 * Print a new room. 
 */
function createNewRoom(num, roomingDataParam, roomElementId) {
	var roomingData;
	if (roomingDataParam == null) {
		roomingData = new RoomData(DEFAULT_ADULTS_SELECTED, DEFAULT_CHILDS_SELECTED);
	} else { 
		roomingData = roomingDataParam;
	}
	var nChildsAllowed = getNumChildsAllowed(roomingData.nAdults);
	
	var newRoomContent = "";
	newRoomContent+= ' <div class="sep02"></div><br class="hide" /><span class="room"><strong>' + ROOM_TXT + ' ' + num + '</strong></span><br class="hide" />';
	newRoomContent+= ' <label for="' + getAdultElementIdFromPrefix(roomElementId, num) + '">' + ADULTS_TXT;
	newRoomContent+= ' <select class="long2" id="' + getAdultElementIdFromPrefix(roomElementId, num) + '" onchange="checkNumChilds(' + num + ', \'' + roomElementId + '\');">';
	newRoomContent+= createPersonsOptions(NUM_MIN_ADULTS_BY_ROOM, NUM_MAX_ADULTS_BY_ROOM, roomingData.nAdults, 'ADULTS_OPTION_TXT');
	newRoomContent+= ' </select>';
	newRoomContent+= ' </label>';
	newRoomContent+= ' <span class="space"></span>';
	newRoomContent+= ' <label for="' + getChildElementIdFromPrefix(roomElementId, num) + '">' + CHILDS_TXT;
	var disabled = ((nChildsAllowed == 0)?'disabled':'');
	var classDisabled = ((disabled == '')?'':' disabled');
	newRoomContent+= '	<select class="long2' + classDisabled +'" id="' + getChildElementIdFromPrefix(roomElementId, num) + '" ' + disabled + '>';
	newRoomContent+= createPersonsOptions(NUM_MIN_CHILDS_BY_ROOM, nChildsAllowed, roomingData.nChilds, 'CHILDS_OPTION_TXT');
	newRoomContent+= '	</select>';
	newRoomContent+= '</label>';
	return newRoomContent;
}

/* 
 * Create person options for select. 
 */
function createPersonsOptions(min, max, numPreviousSelected, msg) {
	var content = "";
	for (var i = min; i <= max; i++) {
		content+= '<option value="' + i + '" ' + ((numPreviousSelected == i)?"selected":"") + '>' + getOptionMessage(i, msg);
		content+= '</option>';
	}
	return content;
}

/* 
 * Get the message for the option. 
 */
function getOptionMessage(num, msg) {
	msg+= (num == 1)?"_SINGLE":"";
	return num + " " + eval(msg); 
}

/* 
 * Check the number of childs that can be selected. 
 */
function checkNumChilds(numRoom, roomElementId) {
	var adultElementId = getAdultElementIdFromPrefix(roomElementId, numRoom);
	var childElementId = getChildElementIdFromPrefix(roomElementId, numRoom);
	var nAdults = parseInt(get(adultElementId).value);
	var nChildsAllowed = getNumChildsAllowed(nAdults);
	
	var nChilds = get(childElementId);
	markComboAsEnabled(nChilds);
	nChilds.innerHTML = "";

	for (var i = NUM_MIN_CHILDS_BY_ROOM; i <= nChildsAllowed; i++) {
		nChilds[nChilds.length] = createOption(i, getOptionMessage(i, 'CHILDS_OPTION_TXT'), false);
	}
	
	if (nChildsAllowed == 0){
		markComboAsDisabled(nChilds);
	}
}

/* 
 * Get the number of childs selectables. 
 */
function getNumChildsAllowed(adults) {
	return (NUM_MAX_PERSONS_BY_ROOM - adults);
}

/* 
 * Get adult element. 
 */
function getAdultElementIdFromPrefix(prefix, index) {
	return getPersonElementIdFromPrefix(prefix, NADULTS_ELEMENT_ID_PREFIX, index);
}

/* 
 * Get child element. 
 */
function getChildElementIdFromPrefix(prefix, index) {
	return getPersonElementIdFromPrefix(prefix, NCHILDS_ELEMENT_ID_PREFIX, index);
}

/* 
 * Get person element. 
 */
function getPersonElementIdFromPrefix(prefix, elementType, index) {
	return prefix + elementType + index;
}