/*
Author: David Pisek (d.pisek@a-m-p.at)
*/
///////////////////////////////////////////////////////////
//Factory 
///////////////////////////////////////////////////////////


/**
*Wird beim Ver�ndern des Obersten SelectFields aufgerufen
*Erzeugt ein Calculator Objekt und ruft dessen showTickets-Methode auf
*/
function initCalculator(value) {
	switch (value) {
		case 'Therme':
			calculator = new Therme();
		break;
		case 'Freibad':
			calculator = new Freibad();
		break;
		case 'Sauna':
			calculator = new Sauna();
		break;		
		case 'ThermeSauna':
			calculator = new ThermeSauna();
		break;		
		case 'ThermeFreibad':
			calculator = new ThermeFreibad();
		break;
		case 'Eislauf':
			calculator = new Eislauf();
		break;
		default:
			calculator = false;
			break;
	}
	calculator.area = value;
	if (calculator) {
		calculator.showTickets($('calculationForm'), 'container');
	}
}


///////////////////////////////////////////////////////////
// Basisklasse
///////////////////////////////////////////////////////////
var Calculator = function() {
}


/**
*Zeigt die auszuwählenden Tickets als Selectfield an
*/
Calculator.prototype.showTickets = function(formularObject, containerId) {
	//Falls vorhanden div container löschen
	if ($(containerId) != null) {
		formularObject.removeChild($(containerId));
	}
	
	//Div Container für die Dynamischen Elemente erzeugen
	var divContainer = document.createElement('div');
	divContainer.id = containerId;
	
	//Header
	this.createHeader(divContainer, 'Ticket Typ');
	
	//Neues SelectElement erzeugen
	var selectField = document.createElement('select');
	selectField.name = 'ticketType';
	
	//Onchange Event für den Aufruf der Show Calculator Methode hinzuf�gen
	selectField.onchange = function() {
		calculator.showAge(this.options[this.selectedIndex].value, divContainer)
	};
	optionElement = document.createElement('option');
	optionElement.appendChild(document.createTextNode("Bitte wählen Sie aus"));
	optionElement.value = 'false';
	selectField.appendChild(optionElement);
	//Die Vorkonfigurierten Tickets als options erzeugen und an das SelectField hängen
	for (i in this.tickets) {
		//Mootools-fix
		if (!ticketTypes.contains(i)) continue;
		optionElement = document.createElement('option');
		optionElement.appendChild(document.createTextNode(i))
		optionElement.value = i;
		selectField.appendChild(optionElement);
	}
	
	divContainer.appendChild(selectField);
	formularObject.appendChild(divContainer);
}	


/**
*Alle Konfigurierten Tickets als Array
*/
Calculator.prototype.getTickets = function() {
	var tickets = new Array();
	for (i in this.tickets) {
		tickets.push(i);
	}
	return tickets;
}


/**
*Schreibt die Input-Felder für Alter / Anzahl in das Formular
*Todo: Konfigurationss auslese anpassen
**/
Calculator.prototype.showAge = function(ticket, divObject) {
	if(ticket == 'false') {
		return;
	}
	//Tickettyp speichern
	this.ticketType = ticket;
	
	//Falls vorhanden Container löschen
	if ($('ticketDiv') != null) {
		divObject.removeChild($('ticketDiv'));
	}
	
	//Container f�r die folgenden Elemente erzeugen
	var ticketDiv = document.createElement('div');
	ticketDiv.id = 'ticketDiv';
		
	//Header
	this.createHeader(ticketDiv, 'Anzahl der Personen');
	
	//Holt sich die Konfigurierten Werte und schreibt dementsprechende Input-Felder bzw. löscht die vorher geschriebenen
	var ages = this.getConfiguration(ticket, 0);
	for (i = 0; i < ages.length; i++) {
		//Input-Objekte erzeugen
		var inputObject  = document.createElement('input');
		inputObject.size = "3";
		inputObject.type = 'text';
		inputObject.id   = ages[i].replace(/ /g,"_");
		inputObject.name = ages[i];
		inputObject.value = "0";
		inputObject.onfocus = function() {
			temp = this.value;
			this.value = "";
		};
		inputObject.onblur = function() {
			if (this.value == temp || this.value == "") {
				this.value = temp;
			}
		}
		
		//Beschriftung mit span
		var labelText       = document.createElement('span');
		labelText.className = ('persons');
		labelText.innerHTML = ages[i];
		
		ticketDiv.appendChild(labelText);
		ticketDiv.appendChild(inputObject);
	}
	
	
	divObject.appendChild(ticketDiv);
			
	if (specialTickets.contains(this.ticketType)) {
		this.createSubmit(ticketDiv);
		divObject.appendChild(ticketDiv);
		return;
	}
	
	if (this.ticketType == 'Familienticket') {
		var infoDiv = document.createElement('div');
		infoDiv.className = 'infoBox';
		infoDiv.innerHTML = infoText[0];
		//var info = document.createTextNode(infoText[0]);
		//infoDiv.appendChild(info);
		ticketDiv.appendChild(infoDiv);
		
		this.showCalendar(ticketDiv);
		
		return;
	}
	
	if(this.area != 'Sauna') {
		var infoDiv = document.createElement('div');
		infoDiv.className = 'infoBox';
		infoDiv.innerHTML = infoText[1];
		//var info = document.createTextNode(infoText[0]);
		//infoDiv.appendChild(info);
		ticketDiv.appendChild(infoDiv);
		
		
	}
	
	this.showCalendar(ticketDiv);
}


/**
* Schreibt das Inputfeld für die Datumseingabe und den Kalender 
*/
Calculator.prototype.showCalendar = function(ticketDiv) {
	//Header 
	this.createHeader(ticketDiv, 'Datum');
	
	//Input-Feld
	var inputObject  = document.createElement('input');
	inputObject.name = 'date';
	inputObject.type = 'text';
	inputObject.id   = 'date';
	inputObject.size = '12';
	ticketDiv.appendChild(inputObject);
	
	//Kalender initialisieren
	cal  = new Epoch('epoch_popup','popup',document.getElementById('date'));
	
	//Aktuelles Datum einf�gen
	inputObject.value = (cal.curDate.dateFormat());
	
	//Dauer anzeigen
	this.showDuration(ticketDiv);
	this.createSubmit(ticketDiv);
}


/**
* Schreibt die möglichen Ticket-Zeiten
*/
Calculator.prototype.showDuration = function(divObject) {
	//Header
	this.createHeader(divObject, 'Nutzungsdauer');
	
	//Holt sich die Konfigurierten Werte und schreibt dementsprechende Input-Felder bzw. l�scht die vorher geschriebenen
	var selectDuration      = document.createElement('select');
	selectDuration.name     = 'ticketDuration'; 
	selectDuration.id       = 'ticketDuration';
	
	var durations = this.getConfiguration(this.ticketType,1);
	for (i = 0; i < durations.length; i++) {
		var optionObject = document.createElement('option');
		optionObject.value = durations[i];
		
		//Zusätzliche Informationen		
		optionObject.appendChild(document.createTextNode(durations[i]));
		
		if ( (typeof(ticketInfo[this.area]) != 'undefined') && (typeof(ticketInfo[this.area][durations[i]]) != 'undefined') ) {
			optionObject.appendChild(document.createTextNode(" " + ticketInfo[this.area][durations[i]]));
		}
		
		selectDuration.appendChild(optionObject);
	}
	
	divObject.appendChild(selectDuration);
} 


/**
*Gibt die die konfigurierten Informationen eines bestimmten Levels (0 = Alter, 1= Dauer) f�r einen Tickettyp als Array zur�ck
*zb.: calculator.getConfiguration('Einzelticket, 0)
*/
Calculator.prototype.getConfiguration = function(ticketType, level) {
	configuration = this.tickets[ticketType][level];
	configuration = configuration.split(",");
	var configArray = new Array();
	for(i=0; i < configuration.length; i++) {
		//alert(this.names[level][configuration[i]]);
		configArray.push(this.names[level][configuration[i]]);
	}
	return configArray;
}


/**
*Erzeugt ein H-Element und hängt es an den �bergebenen Container
**/
Calculator.prototype.createHeader = function(divObject, text, level) {
	if (level == null) {
		level = 'h2';
	}
	
	var header = document.createElement(level);
	
	header.appendChild(document.createTextNode(text));
	divObject.appendChild(header);
}


/**
* Schreibt den Sumbitbutton
*/
Calculator.prototype.createSubmit = function(divObject) {
	//Checken ob Elemente schon im DOM
	if ($('calculationStart') != null) {
		divObject.removeChild($('calculationStart'));
		divObject.removeChild($(this.resultContainer));
	}
	
	//Divcontainer für Ergebnis
	this.resultContainer = "resultContainer";
	var resultDiv = document.createElement('div');
	resultDiv.id  = this.resultContainer;
	
	//Button
	var submitObject   = document.createElement('input');
	submitObject.id    = 'calculationStart';
	submitObject.type  = 'button';
	submitObject.value = 'Berechnen';
	submitObject.onclick = function(){calculator.checkSubmit()};
	divObject.appendChild(submitObject);
	divObject.appendChild(resultDiv);
	
	var targetBlank = document.createAttribute("target");
	targetBlank.nodeValue = "_blank";
	
	linkPrices = document.createElement('a');
	linkPrices.id = 'preisliste';
	linkPrices.href = "http://www.erlebnistherme-zillertal.at/index.php/de/service_aktuelles/preise";
	linkPrices.setAttributeNode(targetBlank);
	linkPrices.innerHTML = "Preisliste";
	
	var targetBlankHours = document.createAttribute("target");
	targetBlankHours.nodeValue = "_blank";
	
	linkHours = document.createElement('a');
	linkHours.id = 'hours';
	linkHours.href = "http://www.erlebnistherme-zillertal.at/index.php/de/service_aktuelles/oeffnungszeiten";
	linkHours.setAttributeNode(targetBlankHours);
	linkHours.innerHTML = "Öffnungszeiten";
	
	linkGewa = document.createElement('div');
	linkGewa.id = 'gewahr';
	linkGewa.innerHTML = "Ergebnis ohne Gewähr.";
	
	divObject.appendChild(linkPrices);
	divObject.appendChild(linkHours);
	divObject.appendChild(linkGewa);
	
}


/**
*Holt sich die Benutzereingaben aus dem Formular
*/
Calculator.prototype.getFormValues = function() {
	//TicketTyp
	this.formValues = new Array();
	this.formValues['ticketType'] = this.ticketType;
	
	//Personen
	this.formValues['persons'] = new Array();
	
	var ages = this.getConfiguration(this.ticketType, 0);
	for (i = 0; i < ages.length; i++) {
		var inputId = ages[i];
		inputId = inputId.replace(/ /g, "_");
		this.formValues['persons'][inputId] = $(inputId).value; 
	}
	if(specialTickets.contains(this.ticketType)) {
		return (this.formValues);
	}
	
	//Datum
	this.formValues['date'] = $('date').value;
	
	//Dauer
	this.formValues['ticketDuration'] = $('ticketDuration').value;
	
}


/**
*Überprüft die Benutzereingaben
*Todo: Datums-format Checken
**/
Calculator.prototype.checkSubmit = function() {
	this.getFormValues();
	
	//Anzahl / Personen checken
	var checked = false;
	for (i in this.formValues['persons']) {
		//Mootools-fix
		if (!alter.contains(i.replace(/_/g, " "))) continue;
				
		//Falls ein Wert 0 oder "" ist abbrechen
		if ( ($(i).value > 0) && ($(i).value != "") && (isNaN(parseInt(i))) ) {
			checked = true;
		}
	}
	if(!checked) {
		alert("Bitte mindestens 1 Person angeben");
		return;
	}
	
	if(specialTickets.contains(this.ticketType)) {
		this.calculationRequest();
		return;
	}
	
	if (this.ticketType == 'Familienticket') {
		//Mindestens 1 er + 1 kind
		
		if ( (this.formValues['persons']['ab_18'] < 1) ) {
			alert ('Mindestens 1 Erwachsener und 1 Kind für Familienticket notwendig');
			return;
		}		
		if ( (this.formValues['persons']['ab_6'] < 1) && (this.formValues['persons']['ab_15'] < 1) ) {
			alert ('Mindestens 1 Erwachsener und 1 Kind für Familienticket notwendig');
			return;
		}
		this.calculationRequest();
	}
	
	if ($('date').value == "") {
		alert("Bitte Datum eingeben");
		return;
	}

	this.calculationRequest();
};


/**
*Sendet den Ajax Request und f�hrt die Callback-funktion addValues() aus
*/
Calculator.prototype.calculationRequest = function() {
	url = calculatorUrl + this.createQuery();
			
	var request = new Json.Remote(url, {
		onComplete: function(jsonObj) {
			calculator.addValues(jsonObj);
		},
		onRequest: function() {
			calculator.showLoader();
		}
	}).send();
}


/**
*Callback funktion des Ajax-Requests
*/
Calculator.prototype.addValues = function(values) {
	var container = $(this.resultContainer);
	container.removeChild($('loaderImage'));
	
	if($('resultSpan') != null) {
		container.removeChild($('resultSpan'));
	}
	
	var resultText = document.createElement("span");
	resultText.id = 'resultSpan';
	resultText.appendChild(document.createTextNode('Preis: ' + values.price + ' Euro'));
	
	container.appendChild(resultText);
	
	/*if <span id="addTicket"> already exists, remove it*/		
	if($('addTicket') != null) {
		container.removeChild($('addTicket'));
	}	
	
	/*if <span id="addDuration"> already exists, remove it*/		
	if($('addDuration') != null) {
		container.removeChild($('addDuration'));
	}	
	
	// <span id="addTicket"> hinzuf�gen	
	var type = this.ticketType;
	if ( (typeof(addInfo[this.area]) != 'undefined') && (typeof(addInfo[this.area][type]) != 'undefined') ) {
		addText = document.createElement("span");
		addText.id = 'addTicket';
		addText.appendChild(document.createElement('br'));
		addText.appendChild(document.createTextNode(" " + addInfo[this.area][type]));	
			
		container.appendChild(addText);	
	}
	
	// <span id="addDuration"> hinzuf�gen	
	var duration = this.formValues['ticketDuration'];
	if ( addInfoDurations.contains(duration) ) {
		addText = document.createElement("span");
		addText.id = 'addDuration';
		addText.appendChild(document.createElement('br'));
		addText.appendChild(document.createTextNode(" " + addInfoDurationsText));	
				
		container.appendChild(addText);	
	}
		
}

/**
* Zeigt das loader.gif an
*/
Calculator.prototype.showLoader = function() {
	var imageSrc  = "templates/images/loader.gif";
	var container = $(this.resultContainer);
	var imageObj  = document.createElement('img');
	
	imageObj.src = imageSrc;
	imageObj.id  = "loaderImage";
	container.appendChild(imageObj);
}


/**
*Erzeugt die Query für den Ajax-Request
*/
Calculator.prototype.createQuery = function() {
	
	query  = "?area="+this.area;	
	query += "&ticketType="+this.ticketType;	
	
	if (this.formValues['persons']['ab_6'] != null) {
		query += "&ab_6="+this.formValues['persons']['ab_6'];
	} else {
		query += "&ab_6=0";
	}
	
	query += "&ab_15="+this.formValues['persons']['ab_15'];
	query += "&ab_18="+this.formValues['persons']['ab_18'];
	
	//Saisonkarten, 10erBlöcke und Jahreskarten
	if(specialTickets.contains(this.ticketType)) {
		query += "&ticketDuration=0";
		query += "&date=0";
		
		return query;
	}
	
	query += "&date="+this.formValues['date'];
	query += "&ticketDuration="+this.formValues['ticketDuration'];

	return query;
}
