
// JS-Datei für das Extended-Formular

// Angeben wie viele Zimmer gleich am Anfang angezeigt werden sollen
var roomsdisplay = 1;

// Definitionen der Zimmertypen und deren maximale Anzahl Personen angeben
var roomdefinitions = new Array();

// Definitionen der Zimmerkategorien pro Zimmertyp
var personsperroom = new Array();

// Definieren der verfügbaren Services
var availableservices = new Array();

// Definieren der Services pro Zimmerkategorie
var servicesperroom = new Array();

// Angeben ob das Alter der Kinder als Pflichtfeld markiert werden soll
var kidsagerequired = false;

// Felder angeben, die beim entfernen eines Zimmers leer gesetzt werden sollen
var fields2reset = new Array('roomcategory{loop}', 'service{loop}', 'adults{loop}', 'kids{loop}', 'kidsage{loop}1', 'kidsage{loop}2', 'kidsage{loop}3', 'kidsage{loop}4', 'kidsage{loop}5', 'kidsage{loop}6', 'kidsage{loop}7', 'kidsage{loop}8', 'kidsage{loop}9', 'kidsage{loop}10');

// Funktion zum hinzufügen eines Zimmers
function addroom()
{
	var obj = document.getElementById('room'+(roomsdisplay+1));
	if (!obj)
	{
		return;
	}
	roomsdisplay += 1;
	obj.style.display = '';
	if (roomsdisplay > 1)
	{
		document.getElementById('removeroomlink').style.display = '';
	}
	if (!document.getElementById('room'+(roomsdisplay+1)))
	{
		document.getElementById('addroomlink').style.display = 'none';
	}
	else
	{
		document.getElementById('addroomlink').style.display = '';
	}
}

// Funktion zum entfernen eines Zimmers
function removeroom()
{
	if (roomsdisplay <= 1)
	{
		return;
	}
	var obj = document.getElementById('room' + roomsdisplay);
	if (!obj)
	{
		return;
	}
	obj.style.display = 'none';
	for (var i = 0; i < fields2reset.length; i += 1)
	{
		var obj = document.getElementById(fields2reset[i].replace('{loop}', roomsdisplay));
		if (obj)
		{
			if (obj.value)
			{
				obj.value = '';
			}
			if (obj.options && obj.options[0])
			{
				obj.options[0].selected = true;
			}
		}
	}
	adjustroom(roomsdisplay);
	roomsdisplay -= 1;
	if (roomsdisplay <= 1)
	{
		var obj = document.getElementById('removeroomlink');
		if (obj)
		{
			obj.style.display = 'none';
		}
	}
	var obj = document.getElementById('addroomlink');
	if (obj)
	{
		obj.style.display = '';
	}
}

// Funktion zum anpassen eines Zimmers nach geändertem Wert
function adjustroom(room)
{
	// Anzahl ausgewählte Personen ermitteln
	var persons = getroompersons(room);
	// Anpassen der Erwachsenen
	setadults(room, maxpersons - persons.kids);
	// Anpassen der Kinder
	setkids(room, maxpersons - persons.adults);
	// Laden der möglichen Zimmerkategorien
	loadcategories(room, {adults: persons.adults, kids: persons.kids});
	// setzen der Services
	adjustservices(room);
}

// Funktion zum berechnen der Anzahl ausgewählter Personen
function getroompersons(room)
{
	var adultsobj = document.getElementById('adults' + room);
	var kidsobj = document.getElementById('kids' + room);
	if (adultsobj && kidsobj)
	{
		var adultsvalue = 0;
		var kidsvalue = 0;
		for (var i = 0; i < adultsobj.options.length; i += 1)
		{
			if (adultsobj.options[i].selected)
			{
				adultsvalue = parseInt(adultsobj.options[i].text);
				break;
			}
		}
		for (var i = 0; i < kidsobj.options.length; i += 1)
		{
			if (kidsobj.options[i].selected)
			{
				kidsvalue = parseInt(kidsobj.options[i].text);
				break;
			}
		}
		return {adults: adultsvalue, kids: kidsvalue};
	}
	else
	{
		return {adults: 0, kids: 0};
	}
}

// Funktion zum setzen der maximalen Anzahl der Erwachsenen eines Zimmers
function setadults(room, roomsize)
{
	var obj = document.getElementById('adults' + room);
	if (!obj)
	{
		return false
	}
	for (var i = 0; i < obj.options.length; i += 1)
	{
		if (parseInt(obj.options[i].text) > roomsize)
		{
			obj.options[i] = null;
			i -= 1;
		}
	}
	if (obj.options.length - 1 < roomsize)
	{
		for (var i = obj.options.length; i - 1 < roomsize; i += 1)
		{
			var newOption = new Option(i, i, false);
			obj.options[obj.options.length] = newOption;
		}
	}
}

// Funktion zum setzen der maximalen Anzahl der Kinder eines Zimmers
function setkids(room, roomsize)
{
	var obj = document.getElementById('kids' + room);
	if (!obj)
	{
		return false
	}
	// Außnahme für Cavallino: Alter der Kinder Pflichtfeld
	if (kidsagerequired == true)
	{
		for (var i = 1; i <= maxpersons; i += 1)
		{
			var field = 'kidsage'+room+i;
			set_isrequired(field, 'string', false);
		}
	}
	for (var i = 0; i < obj.options.length; i += 1)
	{
		if (parseInt(obj.options[i].text) > roomsize)
		{
			obj.options[i] = null;
			i -= 1;
		}
	}
	if (obj.options.length - 1 < roomsize)
	{
		for (var i = obj.options.length; i - 1 < roomsize; i += 1)
		{
			var newOption = new Option(i, i, false);
			obj.options[obj.options.length] = newOption;
		}
	}
	for (var i = 0; i < obj.options.length; i += 1)
	{
		if (obj.options[i].selected)
		{
			kids = parseInt(obj.options[i].text);
			break;
		}
	}
	var i = 1;
	while (obj = document.getElementById('kidagebox'+room+i))
	{
		if (i <= kids)
		{
			obj.style.display = '';
			if (kidsagerequired == true)
			{
				var field = 'kidsage'+room+i;
				set_isrequired(field, 'string', true);
			}
		}
		else
		{
			obj.style.display = 'none';
			var obj = document.getElementById('kidsage' + room + i);
			if (obj)
			{
				obj.value = '';
			}
		}
		i += 1;
	}
}

// Funktion zum laden der Zimmerkategorien pro Zimmer je nach Anzahl der Personen
function loadcategories(room, persons)
{
	// Zimmerkategorien filtern
	var categories = new Array();
	var nrcats = 0;
	for (var roomcode in personsperroom)
	{
		if (roomcode != roomcode.toUpperCase())
		{
			continue;
		}
		var value = personsperroom[roomcode];
		if (typeof(value) != 'object' || !value.min || !value.max) continue;
		var enough = persons.adults + persons.kids >= value.min;
		var toomuch = persons.adults + persons.kids > value.max;
		if (value.minadults && persons.adults < value.minadults)
		{
			var enough = false;
		}
		if (value.extrakids)
		{
			var free = value.max - persons.adults;
			if (free >= 0)
			{
				toomuch = toomuch && value.extrakids + free - persons.kids < 0;
			}
		}
		if (enough && !toomuch)
		{
			categories[nrcats] = roomcode;
			nrcats += 1;
		}
	}
	// ausgewählte Zimmerkategorie ermitteln (wird danach wieder gesetzt falls vorhanden)
	var obj = document.getElementById('roomcategory'+room);
	if (!obj)
	{
		return;
	}
	var thiscode = '';
	for (var i = 0; i < obj.options.length; i += 1)
	{
		if (obj.options[i].selected == true)
		{
			thiscode = obj.options[i].value;
			break;
		}
	}
	
	// prüfen wie viele Personen nötig sind
	var minpersons = maxpersons;
	for (var i in personsperroom)
	{
		if (personsperroom[i].min < minpersons)
		{
			minpersons = personsperroom[i].min;
		}
	}
	
	// neue Zimmerkategorien in Select laden
	for (var i = obj.options.length - 1; i >= 0; i -= 1)
	{
		obj.options[i] = null;
	}
	if (persons.adults + persons.kids < minpersons)
	{
		var newOption = new Option(selectpersonstext, '', true, true);
		obj.options[obj.options.length] = newOption;
	}
	else
	{
		var newOption = new Option(nocategorytext, '', true, true);
		obj.options[obj.options.length] = newOption;
	}
	for (var i = 0; i < nrcats; i += 1)
	{
		var code = categories[i];
		if (thiscode == code)
		{
			var newOption = new Option(roomdefinitions[code], code, true, true);
		}
		else
		{
			var newOption = new Option(roomdefinitions[code], code);
		}
		obj.options[obj.options.length] = newOption;
	}
}

// Funktion zum laden der Services pro Zimmer je nach Zimmertyp
function adjustservices(room)
{
	if (!servicesperroom || servicesperroom.length <= 0) return;
	
	var obj = document.getElementById('roomcategory'+room);
	if (!obj)
	{
		return;
	}
	var roomcode = '';
	for (var i = 0; i < obj.options.length; i += 1)
	{
		if (obj.options[i].selected == true)
		{
			roomcode = obj.options[i].value;
			break;
		}
	}
	
	var obj = document.getElementById('service'+room);
	if (!obj)
	{
		return;
	}
	
	// default Service speichern
	var selectedService = '';
	for (var i = 0; i < obj.options.length; i += 1)
	{
		if (obj.options[i].selected == true)
		{
			selectedService = obj.options[i].value;
		}
	}
	
	// alle Services löschen
	for (var i = 0; i < obj.options.length;)
	{
		obj.options[i] = null;
	}
	
	// definierte Services setzen
	if (selectedService == '')
	{
		var newOption = new Option(availableservices[0], '', true, true);
	}
	else
	{
		var newOption = new Option(availableservices[0], '');
	}
	obj.options[0] = newOption;
	
	if (roomcode == '' || availableservices.length <= 0 || !servicesperroom[roomcode]) return;
	
	for (var i = 0; i < servicesperroom[roomcode].length; i += 1)
	{
		var value = servicesperroom[roomcode][i];
		if (!availableservices[value]) continue;
		if (value == selectedService)
		{
			var newOption = new Option(availableservices[value], value, true, true);
		}
		else
		{
			var newOption = new Option(availableservices[value], value);
		}
		obj.options[obj.options.length] = newOption;
	}
}

// Funktion zum setzen von Werten bei verschiedenen Feldern (select, checkbox)
function set_fieldvalue(objid, value)
{
	if (objid.indexOf(',') == -1)
	{
		var obj = document.getElementById(objid);
		if (obj)
		{
			if (obj.options)
			{
				// bei einem select
				for (var i = 0; i < obj.options.length; i += 1)
				{
					if (obj.options[i].value == value)
					{
						obj.options[i].selected = true;
						return true;
					}
				}
				return false;
			}
			else
			{
				// bei einer Checkbox
				if (obj.value == value)
				{
					obj.checked = true;
				}
				else
				{
					obj.checked = false;
				}
				return true;
			}
		}
	}
	else
	{
		// es handelt sich um eine Radiobox
		objid = objid.split(',');
		for (var i = 0; i < objid.length; i += 1)
		{
			var obj = document.getElementById(objid[i]);
			if (obj)
			{
				if (obj.value == value)
				{
					obj.checked = true;
					break;
				}
			}
		}
	}
}
