// JavaScript Document fuer Buchungs-Seite

/*

Inhalt:
==========

= AJAX start
 - Doppel-Buchung verhindern --> Verhindert, dass 2x der selbe Tisch gewaehlt werden kann
 - initialiseren --> Pruefen, ob der Browser AJAX (XMLHTTP) faehig ist
 - Serverantwort empfangen --> Empfaengt die Antwort des Servers auf den Request und gibt sie weiter an request_auswerten() zur Auswertung
 - Anfrage senden --> Stellt eine Verbindung zum Server her und sendet den Request ab
 - Falls die Tischnummer keine Zahl sondern '-' ist, wird anstatt einen Request zu senden die Zeile auf 0 zurueckgesetzt
= AJAX ende

Es folgen diverse Funktionen:

= request_auswerten() --> Wird nach Empfang der Serverantwort gestartet und wertet den Request aus. Benuetzt die Funktionen: alle_plaetze_freigeben(), platz_besetzen(), zeilentotal_berechnen()
= alle_plaetze_freigeben() --> Setzt alle Plaetze eines Tisches auf "frei". Wird ausgefuehrt, bevor ein neuer Tisch angezeigt wird (und bei Reset)
= platz_besetzen() --> Markiert einen bestimmten Platz als "besetzt" (rot und deaktiviert)
= platz_waehlen() --> Falls der Platz frei und sichtbar ist, wir er angewaehlt (Haekchen gesetzt)
= alle_plaetze_waehlen() --> Waehlt alle verfuegbaren Plaetze eines Tisches (Haekchen gesetzt)

= zeilentotal_berechnen() --> Berechnet und schreibt das Preistotal einer Zeile anhand der Anzahl angewaehlten Checkboxen und dem Kategorie-Preis. Ruft auch buchungstotal_berechnen() auf.
= buchungstotal_berechnen() --> Berechnet und schreibt den Totalpreis der Buchung anhand der im Array zeilentotal_arr gespeicherten Werten

= formular_reset() --> Laedt die Tischbelegungen neu, da nach einem Klick auf den Formular-Zuruecksetzen-Button andere Tischnr. in den Dropdown-Listen gewaehlt sein koennen, als aktuell angezeigt werden. Ruft fuer jede Zeile ajaxFunction() auf.
= button_deaktivieren() --> Deaktiviert nach Absenden des Formulares den "Senden"-Button, um mehrmaliges Klicken zu verhindern
= formular_leeren() --> Loescht alle Werte von Eingabefeldern, Dropdown-Listen, etc. (Leert das Formular)

= Zeichenzahl in textarea begrenzen start
 - setMaxLength() --> Bereitet das Textfeld auf die Zeichenbegrenzung vor
 - checkMaxLength() --> Prueft die Anzahl Zeichen im Textfeld und gibt ggf. eine Fehlermeldung aus
= Zeichenzahl in textarea begrenzen ende

= Nachkommastellen ergaenzen start
 - endnullen_ergaenzen() --> Ergaenzt die Nachkommastellen auf 2, also z.B. "30" zu "30.00"
 - stristr() --> Wie PHP-Funktion stristr(). Gibt String ab erstem Vorkommen vom Zeichen zurueck
= Nachkommastellen ergaenzen ende

==========

*/
total_plaetze = new Object(); // wird zu Array
rabatt = 0;
rabatt_pers = 0;
rabatt_proz = 0;
if(typeof url_erweiterung == "undefined")
{ url_erweiterung = ''; } // Dies ist der Fall, wenn die oeffentliche Buchungsseite benutzt wird. Bei der internen ist url_erweiterung = '../../'

// ============== AJAX start ==============
// ---- Doppel-Buchung verhindern ----
function ajaxFunction(tischnr,zielID)
{
   var  tischnr_valid = true;
   
   if (tischnr != '-')
   {
	 for (i=1; i<=anz_tischzeilen; i++) // Alle Zeilen durchgehen
		{
			if ((document.getElementById('inp_tischnr_'+i).value == tischnr) && (i != zielID)) // Selbe Tischnr in anderer Zeile gefunden
			{
				alert(unescape("Sie k%F6nnen nicht 2x den selben Tisch ausw%E4hlen"));
				document.getElementById('inp_tischnr_'+zielID).value = '-';
				tischnr_valid = false;
			}
		}  
  }
 
// ---- initialisieren ---- 
  if ((tischnr != '-') && (tischnr_valid == true))
  {
	var xmlhttp;
	var url= url_erweiterung+"httprequest.php?tischnr="+tischnr+"&sid="+Math.random(); // Die zusaetzliche Mitgabe von einer zufaelligen Nummer (sid) verhindert, dass der Browser eine Cache-Version der Seite benutzt.
	if (window.XMLHttpRequest)
	  {
	   // code for IE7+, Firefox, Chrome, Opera, Safari
	   xmlhttp=new XMLHttpRequest();
	  }
	else if (window.ActiveXObject)
	  {
	   // code for IE6, IE5
	   xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
	  }
	else
	  {
	   alert(unescape("Ihr Browser unterst%FCtzt kein AJAX / XMLHTTP%21%0AEs k%F6nnen keine Pl%E4tze reserviert werden.\r\nSenden Sie bitte ein E-Mail an: ticket@crazyshakers.ch"));
	  }
	
	
// ---- Serverantwort empfangen ----
	xmlhttp.onreadystatechange=function()
	{
	 if(xmlhttp.readyState==1) // Request in Arbeit
	  {
		document.getElementById('tisch_plaetze_'+zielID).style.width = '0px';
		document.getElementById('tisch_plaetze_'+zielID).style.height = '0px';
		document.getElementById('tisch_status_'+zielID).innerHTML = '<img src="http://crazyshakers.ch/saalplan/normal/loading.gif" height="20" width="20"> Bitte warten, Platzbelegung wird geladen...';
		document.getElementById('tisch_status_'+zielID).style.width = 'auto';
		document.getElementById('tisch_status_'+zielID).style.height = 'auto';
	  }
	 else if(xmlhttp.readyState==4) // Request vollstaendig
	  {
		document.getElementById('tisch_status_'+zielID).innerHTML = '';
		request_result=xmlhttp.responseText;
		//document.getElementById('debuginfo').innerHTML = '<textarea rows="10" cols="40">'+request_result+'</textarea>';
		request_auswerten(request_result,zielID);
	  }
	}
	
// ---- Anfrage senden ----
	xmlhttp.open("GET",url,true);
	xmlhttp.send(null);
	
  } // Ende: if Tischnr != '-'
  else if (tischnr_valid == true)// Wenn Tischnr = '-' , dann Plaetze & Status zuruecksetzen
  {
	document.getElementById('tisch_status_'+zielID).innerHTML = '';
	document.getElementById('tisch_status_'+zielID).style.width = '0px';
	document.getElementById('tisch_status_'+zielID).style.height = '0px';
	document.getElementById('tisch_plaetze_'+zielID).style.width = '0px';
	document.getElementById('tisch_plaetze_'+zielID).style.height = '0px';
	document.getElementById('td_kat_'+zielID).innerHTML = '';
	document.getElementById('td_total_'+zielID).innerHTML = '';
	for (p=0; p<10; p++) // Alle Haken bei den Plaetzen des aktuellen Tisches entfernen
	{
		document.getElementsByName('seatbox_'+zielID+'[]')[p].checked = false;
	}
	zeilentotal_berechnen(zielID); // Das Zeilentotal muss neu berechnet werden (sollte logischerweise 0 ergeben)
  }
  else // Tischnummer war falsch (bzw. doppelt)
  {
	ajaxFunction('-',zielID);  
  }
}

// ============== AJAX Ende ==============

// ============== Request auswerten ==============

function request_auswerten(result,zielID) // Request-Antwort auswerten und anwenden
{
	var fehlermeldung = result.replace(/([\S\s]*)<fehlermeldung>(.*?)<\/fehlermeldung>([\S\s]*)/i, '$2');
	var tischnr = parseInt(result.replace(/([\S\s]*)<tischnr>(.*?)<\/tischnr>([\S\s]*)/i, '$2'));
	var preis = parseFloat(result.replace(/([\S\s]*)<preis>(.*?)<\/preis>([\S\s]*)/i, '$2'));
	var anzplatz = parseInt(result.replace(/([\S\s]*)<anzplatz>(.*?)<\/anzplatz>([\S\s]*)/i, '$2'));
	var besetzt = result.replace(/([\S\s]*)<besetzt>(.*?)<\/besetzt>([\S\s]*)/i, '$2');
	
	rabatt = result.replace(/([\S\s]*)<rabatt>(.*?)<\/rabatt>([\S\s]*)/i, '$2');
	rabatt_pers = result.replace(/([\S\s]*)<rabatt_pers>(.*?)<\/rabatt_pers>([\S\s]*)/i, '$2');
	rabatt_proz = result.replace(/([\S\s]*)<rabatt_proz>(.*?)<\/rabatt_proz>([\S\s]*)/i, '$2');
	
	var preis_string = preis.toString();
	var besetzt_arr = besetzt.split(',');
	
	preis_string = endnullen_ergaenzen(preis_string);
	
	if (fehlermeldung != '') // Es ist ein Fehler aufgetreten
	{
		document.getElementById('tisch_plaetze_'+zielID).style.width = '0px';
		document.getElementById('tisch_plaetze_'+zielID).style.height = '0px';
		document.getElementById('tisch_status_'+zielID).innerHTML = '<span class="fettmittelrot">'+fehlermeldung+'</span>';
		document.getElementById('tisch_status_'+zielID).style.width = 'auto';
		document.getElementById('tisch_status_'+zielID).style.height = 'auto';
	}
	else if (tischnr != parseInt(document.getElementById('inp_tischnr_'+zielID).value)) // aktuelle Tischnr. und die zurueckgegebene stimmen nicht ueberein
	{
		document.getElementById('tisch_plaetze_'+zielID).style.width = '0px';
		document.getElementById('tisch_plaetze_'+zielID).style.height = '0px';
		document.getElementById('tisch_status_'+zielID).innerHTML = '<span class="fettmittelrot">Fehler: Es wurde eine falsche Tischnr. ausgelesen. Bitte erneut versuchen.</span>';
		document.getElementById('tisch_status_'+zielID).style.width = 'auto';
		document.getElementById('tisch_status_'+zielID).style.height = 'auto';
	}
	else // Alles ok
	{
		document.getElementById('td_kat_'+zielID).innerHTML = '<input type="hidden" id="preis_'+zielID+'" value="'+preis+'">CHF '+preis_string;
		alle_plaetze_freigeben(zielID); // Alle Plaetze als "frei" markieren (alte Reservationen entfernen)

		for (x=0; x<besetzt_arr.length; x++) // Die besetzten Plaetze auf "besetzt" schalten
		{
				var temp_besetzt_platz = besetzt_arr[x];
				if (temp_besetzt_platz != '') // Auch wenn kein Platz besetzt ist, hat besetzt_arr ein (leeres) Element
				{ platz_besetzen(zielID, temp_besetzt_platz); }
		}
		document.getElementById('tisch_status_'+zielID).innerHTML = '';
		document.getElementById('tisch_status_'+zielID).style.width = '0px';
		document.getElementById('tisch_status_'+zielID).style.height = '0px';
		for (y =10; y>anzplatz; y--) // Nicht vorhandene Plaetze nicht anzeigen
		{
			document.getElementById('seatspan_'+zielID+'_'+y).style.visibility = 'hidden';
			document.getElementById('seatspan_'+zielID+'_'+y).style.width = '0px';
		}
		document.getElementById('tisch_plaetze_'+zielID).style.width = 'auto';
		document.getElementById('tisch_plaetze_'+zielID).style.height = 'auto';
		zeilentotal_berechnen(zielID);
	}
}


// ============== Alle Plaetze freigeben ==============

function alle_plaetze_freigeben(zielID) // Alle Plaetze eines Tisches auf "frei" setzen, bevor neue Reservationen eingetragen werden.
{
  for (platz=1; platz<=10; platz++)
  {
	 document.getElementById('seatspan_'+zielID+'_'+platz).style.backgroundColor = '#0F0';
	 document.getElementsByName('seatbox_'+zielID+'[]')[platz-1].disabled = false;
	 document.getElementById('seatspan_'+zielID+'_'+platz).title = 'Dieser Platz ist frei';
	 document.getElementsByName('seatbox_'+zielID+'[]')[platz-1].title = 'Dieser Platz ist frei';
	 document.getElementsByName('seatbox_'+zielID+'[]')[platz-1].checked = false; // Haken entfernen
	 document.getElementById('seatspan_'+zielID+'_'+platz).style.visibility = 'visible'; // Alle Plaetze sichtbar machen (falls zuvor ausgeblendet, da nicht existent)
	 document.getElementById('seatspan_'+zielID+'_'+platz).style.width = 'auto'; // Alle Plaetze sichtbar machen (falls zuvor ausgeblendet, da nicht existent)
  }
}

// ============== Einen Plaetz besetzen ==============

function platz_besetzen(zielID, platz) // Setzt einen Platz auf "besetzt" (= rot und nicht anklickbar)
{
	 document.getElementById('seatspan_'+zielID+'_'+platz).style.backgroundColor = 'red';
	 document.getElementsByName('seatbox_'+zielID+'[]')[platz-1].disabled = 'disabled';
	 document.getElementById('seatspan_'+zielID+'_'+platz).title = 'Dieser Platz ist besetzt';
	 document.getElementsByName('seatbox_'+zielID+'[]')[platz-1].title = 'Dieser Platz ist besetzt';
}


// ============== Einen Plaetz anwaehlen ==============

function platz_waehlen(zielID, platz) // Waehlt einen einzelnen Platz aus (checked)
{
	var visible = document.getElementById('seatspan_'+zielID+'_'+platz).style.visibility;
	var disabled = document.getElementsByName('seatbox_'+zielID+'[]')[platz-1].disabled;
	
	if ((visible == 'visible') && (disabled == false))
	{
		document.getElementsByName('seatbox_'+zielID+'[]')[platz-1].checked = 'checked';
	}
}

// ============== Alle verfuegbaren Plaetze eines Tisches anwaehlen ==============

function alle_plaetze_waehlen(zielID)
{
	for (i=1; i<=10; i++)
	{
		platz_waehlen(zielID, i);
	}
	zeilentotal_berechnen(zielID);
}



// ============== Das Zeilen-Preistotal neu berechnen ==============

function zeilentotal_berechnen(zielID) // Berechnet das Preistotal eines Tisches anhand der angeklickten Checkboxen
{
	if (document.getElementById('preis_'+zielID)) // Ist der Preis (Kategorie) vorhanden?
	{
		var anz_plaetze = 0;
		var kateg_preis = parseFloat(document.getElementById('preis_'+zielID).value);
		for (p=0; p<10; p++)
		{
			if (document.getElementsByName('seatbox_'+zielID+'[]')[p].checked == true)
			{
				anz_plaetze++;
			}								   
		}
		
		var zeilenpreis = anz_plaetze*kateg_preis;
		var zeilenpreis_string = zeilenpreis.toString();
		total_plaetze[zielID] = anz_plaetze;
		
		zeilenpreis_string = endnullen_ergaenzen(zeilenpreis_string);

		document.getElementById('td_total_'+zielID).innerHTML = 'CHF '+zeilenpreis_string;
		zeilentotal_arr[zielID] = zeilenpreis; // in Array fuer Buchungstotal speichern
	}
	else // Zeile ist leer (kein Tisch angezeigt)
	{
		document.getElementById('td_total_'+zielID).innerHTML = '';
		zeilentotal_arr[zielID] = 0; // in Array fuer Buchungstotal speichern
		total_plaetze[zielID] = 0;
		delete total_plaetze[zielID];
	}
	
	buchungstotal_berechnen();
}

// ============== Das Buchungs-Preistotal neu berechnen ==============

function buchungstotal_berechnen() // Berechnet den Totalpreis der Buchung anhand der im Array 'zeilentotal_arr' gespeicherten Zeilenwerten
{
	 var buchungstotal = 0;
	 var anz_plaetze_total = 0;
	 var rabatt_multiplikator = 1;
	 
	 for (b=0; b<zeilentotal_arr.length; b++)
	 {
		 buchungstotal = buchungstotal+zeilentotal_arr[b];
	 }
	 
	 if (rabatt == '1') // Rabatt wird gewaehrt
	 {
		 for ( keyVar in total_plaetze )
		 {
			 anz_plaetze_total += total_plaetze[keyVar];
		 }
		 
		 if (anz_plaetze_total >= parseInt(rabatt_pers)) // Genuegend Personen fuer Rabatt
		 {
			rabatt_multiplikator = (100 - rabatt_proz) / 100; 
		 }
	 }
	 
	 buchungstotal = rabatt_multiplikator * buchungstotal;
	 
	 var buchungstotal_string = buchungstotal.toString();
	
	buchungstotal_string = endnullen_ergaenzen(buchungstotal_string);
	
	document.getElementById('totalpreis').innerHTML = 'CHF '+buchungstotal_string;
	document.getElementById('inp_totalpreis').value = buchungstotal;
	if (rabatt_multiplikator != 1)
	{
		document.getElementById('total_txt').innerHTML = 'Total (inkl. '+rabatt_proz+'% Mengenrabatt): ';
	}
	else
	{
		document.getElementById('total_txt').innerHTML = 'Total:';
	}
}


// ============== Formular-Reset ==============

function formular_reset() // Eingabeformular resetten (= Klick auf "Zuruecksetzen"). Die Plaetze muessen neu geladen werden.
{
	if (zu_aktuallisierende_js_ids.length > 0)
	{
		delete total_plaetze;
		total_plaetze = new Object(); // Array neu erstellen

		tischres_eintragen(); // Falls Formular schonmal gesendet wurde, die zuletzt gesendeten Daten eintragen
	}
	else // Falls Formular noch nie gesendet wurde, einfach aktualisieren was vorhanden
	{
		for (i=1; i<=anz_tischzeilen; i++) // Tischnummern zuruecksetzen
		{
		 var tischnr = document.getElementById('inp_tischnr_'+i).value;	
		 ajaxFunction(tischnr,i);
		}
	}
}


// ============== Senden-Button deaktivieren ==============

function button_deaktivieren() // Um mehrmaliges Absenden zu verhindern, wird der Senden-Button nach Absenden des Formulares deaktiviert
{
	document.getElementById('submit').disabled = "disabled";
	document.getElementById('submit').value = "Wird gesendet...";
	setTimeout("buttion_aktivieren();", 60000); // Nach 1min erfolglosen Sendens Button wieder aktivieren
	return true;
}

// ============== Senden-Button wieder aktivieren ==============

function buttion_aktivieren() // 1min nach dem Absenden, wird der Senden-Button wieder aktiviert, falls bis dahin noch nicht neu geladen
{
	stop();
	alert("Das Formular konnte nicht innerhalb 1min abgesendet werden. Bitte versuchen Sie es noch einmal.");
	document.getElementById('submit').disabled = "";
	document.getElementById('submit').value = "Absenden >>";
}


// ============== Formular leeren ==============

function formular_leeren() // Eingabeformular leeren (= Klick auf "Neu")
{
 if (confirm("Wollen Sie wirklich das ganze Formular leeren und neu beginnen?"))
	{
		document.getElementById('inp_vorname').value = '';
		document.getElementById('inp_nachname').value = '';
		document.getElementById('inp_strasse').value = '';
		document.getElementById('inp_land').value = 'CH';
		document.getElementById('inp_plz').value = '';
		document.getElementById('inp_ort').value = '';
		document.getElementById('inp_telefon').value = '';
		document.getElementById('inp_email').value = '';
		document.getElementById('inp_club').value = '';
		document.getElementById('inp_bemerkungen').value = '';
		
		for (i=1; i<=anz_tischzeilen; i++) // Tischnummern zuruecksetzen
		{
			document.getElementById('inp_tischnr_'+i).value = '-';
			document.getElementById('tisch_plaetze_'+i).style.width = '0px';
			document.getElementById('tisch_plaetze_'+i).style.height = '0px';
			
			for (p=0; p<10; p++) // Alle Haken bei den Plaetzen des aktuellen Tisches entfernen
			{
				document.getElementsByName('seatbox_'+i+'[]')[p].checked = false;
			}
			
			document.getElementById('td_total_'+i).innerHTML = ''; // Zeilen-Totalpreis leeren
			document.getElementById('td_kat_'+i).innerHTML = ''; // Zeilen-Kategoriepreis leeren
		}
		
	 for (b=0; b<zeilentotal_arr.length; b++) // Alle Zeilen-Preise aus dem Zwischenspeicher loeschen
	 {
		 zeilentotal_arr[b] = 0;
	 }
	 
	 delete total_plaetze;
	 total_plaetze = new Object(); // Array neu erstellen
	 
	 buchungstotal_berechnen(); // Buchungstotal sollte jetzt 0 ergeben
	 checkMaxLength() // Zaehler fuer Anzahl Zeichen in der Bemerkungs-Textarea zuruecksetzen
	}
}


// ============== Zeichenzahl in textarea begrenzen start ==============

alerted = false; // speichert, ob schon eine Fehlermeldung ausgegeben wurde

// ---- Textfeld vorbereiten ----

function setMaxLength() {
	var x = document.getElementsByTagName('textarea');
	var counter = document.createElement('span');
	counter.className = 'counter';
	for (var i=0;i<x.length;i++) {
		if (x[i].getAttribute('maxlength')) {
			var counterClone = counter.cloneNode(true);
			counterClone.relatedElement = x[i];
			counterClone.innerHTML = '&nbsp; <span>0</span>/'+x[i].getAttribute('maxlength')+' <font class="fettmittelrot">&nbsp;</font>';
			x[i].parentNode.insertBefore(counterClone,x[i].nextSibling);
			x[i].relatedElement = counterClone.getElementsByTagName('span')[0];

			x[i].onkeyup = x[i].onchange = checkMaxLength;
			x[i].onkeyup();
		}
	}
}

// ---- Anzahl Zeichen im Textfeld ueberpruefen ----

function checkMaxLength() {
	var maxLength = document.getElementById('inp_bemerkungen').getAttribute('maxlength');
	var currentLength = document.getElementById('inp_bemerkungen').value.length;
	if (currentLength > maxLength)
		{
		 document.getElementById('inp_bemerkungen').relatedElement.className = 'fettmittelrot';
		 document.getElementById('inp_bemerkungen').style.backgroundColor = 'coral';
		 if (!alerted) {alerted = true; alert('Aus technischen Gründen sind maximal '+maxLength+' Zeichen zulässig');}
		 document.getElementById('submit').disabled =true;
		 document.getElementById('inp_bemerkungen').focus();
		}
	else
	   {
		document.getElementById('inp_bemerkungen').relatedElement.className = '';
		document.getElementById('inp_bemerkungen').style.backgroundColor = '';
		document.getElementById('submit').disabled =false;
	   }
	document.getElementById('inp_bemerkungen').relatedElement.firstChild.nodeValue = currentLength;
	// not innerHTML
}


// ============== Zeichenzahl in textarea begrenzen ende ==============

// ============== Nachkommastellen ergaenzen start ==============

function endnullen_ergaenzen(val)
{
	if (stristr(val, '.') === false) // Gar kein Punkt vorhanden
	{val += '.00';}
	else
	{
		var temp_stristr = stristr(val, '.');
		switch (temp_stristr.length)
		{
			case 1:				// Keine Nachkommastellen angegeben, z.B. "30."
				val += '00'; 
				break;
			case 2:				// Nur eine Nachkommastelle angegeben, z.B. "30.5"
				val += '0'; 
				break;
			case 3:				// Zwei Nachkommastellen angegeben = OK
				break;
			default:			// Mehr Nachkommastelle angegeben => runden
				val = round(val*10000)/10000;
				break;
				
		}
	}
	
	return val;
}

function stristr (haystack, needle, bool) {
    var pos = 0;

    haystack += '';
    pos = haystack.toLowerCase().indexOf((needle + '').toLowerCase());
    if (pos == -1) {
        return false;
    } else {
        if (bool) {
            return haystack.substr(0, pos);
        } else {
            return haystack.slice(pos);
        }
    }
}
// ============== Nachkommastellen ergaenzen ende ==============

