// ajax.js - adaptiert durch Tim Reeves aus Internet-Pro 11/05,
// ursprunglich programmiert von Marco Zierl.
// Fassung für BiR, Stand: 2010-01-19

// Requires startup.js to be loaded as well

// THE BASIS OF ALL AJAX

var xmlhttp = null;
var target_select_obj = null;

function getXMLHttpRequest() {
	// mochiKit does it more or less so...
    var tryThese = [
        function () { return new XMLHttpRequest(); },
        function () { return new ActiveXObject('Msxml2.XMLHTTP'); },
        function () { return new ActiveXObject('Microsoft.XMLHTTP'); },
        function () { return new ActiveXObject('Msxml2.XMLHTTP.4.0'); },
    ];
    for (var i = 0; i < tryThese.length; i++) {
        var func = tryThese[i];
        try {
            return func();
        } catch (e) {
            // pass
        }
    }
    return null;
}

// Perform a test for AJAX capability on page loading
function ajaxProbe() {
	xmlhttp = getXMLHttpRequest();
	if (xmlhttp)
		loading = false;
	else
		alert("AJAX-Technologie nicht verfügbar");
	return;
}

// Standard functions to delete a subtree in DOM model
function delKids(prnt)
{
	// alert('delKids: ' + prnt.nodeName + ' / ' + prnt.nodeValue);
	var c = prnt.lastChild, p;
	while (c) {
		// Note previous while last is still there!
		p = c.previousSibling;
		delTree(prnt, c);
		c = p;
	}
	return;
}

function delTree(prnt, chld)
{
	// alert('delTree:: Parent: ' + prnt.nodeName + ' / ' + prnt.nodeValue +
	// 	  ' Child: ' + chld.nodeName + ' / ' + chld.nodeValue);
	var c = chld.lastChild, p;
	while (c) {
		p = c.previousSibling;
		delTree(chld, c);
		c = p;
	}
	prnt.removeChild(chld);
	return;
}
// FUNCTIONS TO POPULATE EMAIL-ADRESSES, AMPEL-GRAFIKEN AND COUNTRY LISTS ON PAGE LOADING

var ampelSrc = new Array('../images/std/ampel-rot.gif', '../images/std/ampel-gelb.gif',
						 '../images/std/ampel-gruen.gif', '../images/std/empty.gif' );
var ampelAlt1 = new Array('Die Reise ',
 'In der Reise ', 'In der Reise ', 'Der Belegungsstatus der Reise ');
var ampelAlt2 = new Array(' ist ausgebucht oder abgesagt',
 ' sind noch wenige Plätze frei', ' sind noch genügend Plätze frei', ' ist unbekannt');

function onloadData()
{
	var xmlDocument = xmlhttp.responseXML;

	// Empty text values mean there is no child node - catch them
	// alert(xmlhttp.responseText);

	// Parse the xml answer via DOM techniques

	// 1. E-Mail Verweise ggf. einsetzen (anstelle der Grafiken)
	var nr = '', link='', title='', subject='', href='';
	var textObj=null, linkObj=null, spanObj=null;
	var anz = xmlDocument.getElementsByTagName("email").length;
	for (var i=0; i<anz; i++)
	{
		// Hier zählt 'i' lediglich durch die Antworten, doch
		// <nr> bezieht sich korrekterweise auf die Anfrage!!
		nr = xmlDocument.getElementsByTagName("email")[i].childNodes[0].firstChild.data;
		// childNodes[1] = id => not needed (but good for debugging :)
		link = xmlDocument.getElementsByTagName("email")[i].childNodes[2].firstChild.data;
		show = xmlDocument.getElementsByTagName("email")[i].childNodes[3].firstChild.data;
		title = xmlDocument.getElementsByTagName("email")[i].childNodes[4].firstChild.data;
		subject = xmlDocument.getElementsByTagName("email")[i].childNodes[5].firstChild.data;
		href = subject == '' ? 'mailto:' + link
							 : 'mailto:' + link + '?subject=' + subject;
		// alert(link);
		// Zunächst den Link vorbereiten
		textObj = document.createTextNode(show);
		linkObj = document.createElement('a');
		linkObj.setAttribute('href',href);
		linkObj.setAttribute('title',title);
		// Nun Grafik aushängen und Link einhängen
		spanObj = document.getElementById('email' + nr);
		delKids(spanObj);
		spanObj.appendChild(linkObj);
		// MSIE mag es nicht wenn der Textknoten vor dem Einhängen angehängt wird
		spanObj.childNodes[0].appendChild(textObj);
	}

	// 2. Länderliste ggf. einsetzen (oberste Gruppenreise-Seiten)
	var absatzObj = document.getElementById('laenderabsatz');
	if (absatzObj) {
		var myNode=null, myText=null, myBlank=null, myPara=null, landName='';
		anz = xmlDocument.getElementsByTagName("land").length;
		if (anz == 0) {
			myText = document.createTextNode('Keine Länder gefunden.');
			absatzObj.appendChild(myText);
		}
		else
			for (i=0; i<anz; i++)
			{
				// Add a link for each country found
				landName = xmlDocument.getElementsByTagName("land")[i].firstChild.data;
				// Create the link node
				myNode = document.createElement("a");
				// Give it the href attribute
				myNode.setAttribute('href', 'suche.php?f_land=' + escape(landName));
				// Append the text node for the link
				myText = document.createTextNode(landName);
				myNode.appendChild(myText);
				// Html structure used depends on the number of countries
				if (anz < 17) {
					// Each country in its own paragraph
					if (i == 0) {
						// Goes right into the currently empty paragraph absatzObj
						absatzObj.appendChild(myNode);
					} else {
						// Goes into a new paragraph which is last sibling of absatzObj
						myPara = document.createElement("p");
						myPara.appendChild(myNode);
//						absatzObj.parentNode.appendChild(myPara);	// IE5.5 kann nicht
						var parentObj = absatzObj.parentNode;
						parentObj.appendChild(myPara);
					}
				}
				else {
					// All countries in one paragraph, separated by white space
					if (i == 0)
						absatzObj.className = 'laenderabsatz';
					else {
						// White Space Node
						myBlank = document.createTextNode(' ');
						absatzObj.appendChild(myBlank);
					}
					// Append the link node to the results
					absatzObj.appendChild(myNode);
				}
			}
		// Make the standard panel invisible
		document.getElementById('laenderdefault').style.display="none";
		// and the result panel visible
		var gebiet = xmlDocument.getElementsByTagName("gebiet")[0].firstChild.data;
		document.getElementById(gebiet).style.display="block";
	}

	// 3. Alle Ampel-Grafiken einsetzen
	var reise = '', farbe = '', idx, obj;	// ryg => idx 012
	var anz = xmlDocument.getElementsByTagName("reise").length;
	for (i=0; i<anz; i++)
	{
		reise = xmlDocument.getElementsByTagName("reise")[i].childNodes[0].firstChild.data;
		farbe = xmlDocument.getElementsByTagName("reise")[i].childNodes[1].firstChild.data;
		// alert(tournr + ':' + farbe);
		idx = farbe == 'r' ? 0 : farbe == 'y' ? 1 : farbe == 'g' ? 2 : 3;
		obj = document.getElementById('ampel' + (i+1));
		obj.src = ampelSrc[idx];
		tooltip = ampelAlt1[idx] + reise + ampelAlt2[idx];
		obj.alt = tooltip;
		obj.title = tooltip;
	}

	return;
}

function onloadHttpState()
{
	if (xmlhttp.readyState == 4)
	{
		if ( xmlhttp.status == 200) {
			// daten erfolgreich geladen: starte Verarbeitung
			onloadData();
		} else {
			alert("Fehler beim Abrufen der Onload-XML Daten - Status " + xmlhttp.status);
			alert("Statusmeldung vom Server: " + xmlhttp.statusText);
		}
	}
	return;
}

// This is called at the <body onload> event
function ajaxOnload() {

	// Perform a test for AJAX on page loading
	xmlhttp = getXMLHttpRequest();
	if (xmlhttp)
		loading = false;
	else {
		alert("AJAX-Technologie nicht verfügbar");
		return;
		}

	var touren = '', emails = '', curid = '', laender = '', gebiet = 'alle_laender', sep='?', i;
	// Get a list of all the Tour Numbers on the page
	// They are the text content of cells with id's like "tournr<n>"
	for (i=1; true; i++) {
		curid = 'tournr' + i;
		if (document.getElementById(curid) &&
			document.getElementById(curid).firstChild &&
			document.getElementById('ampel' + i)) {
			touren += sep + curid + '=' +
					  document.getElementById(curid).firstChild.nodeValue;
			sep = '&';
			}
		else break;
	}
	// Get a list of all the Email Numbers on the page
	// They are the content of span-elements with id's like "email<n>"
	for (i=1; true; i++) {
		curid = 'email' + i;
		if (document.getElementById(curid) && document.getElementById(curid).firstChild) {
			emails += sep + curid + '=' + document.getElementById(curid).firstChild.id;
			sep = '&';
			}
		else break;
	}
	// If the page needs a "Länderliste" then note that too
	if (document.getElementById('laenderdefault')) {
		// Welche der Länderlisten wird benötigt? Geht als Parameter mit.
		var defAbsatz = document.getElementById('laenderdefault');
		var lndAbsatz = defAbsatz.nextSibling;
		// Good browsers have noted a text node as next sibling for the white space
		// Internet Explorer is not a good browser :)
		if (lndAbsatz.nodeName == '#text') lndAbsatz = lndAbsatz.nextSibling;
		// alert(lndAbsatz.nodeName);
		gebiet = lndAbsatz.getAttribute('id');
		laender = sep + 'landlist=' + gebiet;
		sep = '&';
	}

	// Provisionspartner: For html-files add a referrer-parameter
	var docpath = window.location.pathname;
	var pathlen = docpath.length;
	var docext = docpath.slice(pathlen-5);
	var ref = '';
	if ((docext == '/' || docext == '.html') &&
		  document.referrer && document.referrer.length > 0)
	 { ref = sep + 'referrer=' + escape(document.referrer); }

	// Call "onload.php" on the server to return the email
	// values and insert them into the displayed page
	curid = touren + emails + laender + ref;
	if (curid != '') {
		xmlhttp.open("GET", '../scripts/onload.php' + curid, true);
		xmlhttp.onreadystatechange = onloadHttpState;
		xmlhttp.send(null);
		}
	return;
}

function reiseDaten() {
	var xmlDocument = xmlhttp.responseXML;
	// alert(xmlhttp.responseText);
	var rn = xmlDocument.getElementsByTagName('rn')[0].firstChild.data;
	var titel = xmlDocument.getElementsByTagName('titel')[0].firstChild.data;
	var spanObj = document.getElementById('reiseShow');
	var textObj = document.createTextNode(titel);
	var obj = document.getElementById('euro');
	var rno = document.getElementById('f_reisenummer');
	var land = '', von = '', bis = '', preis = '';
	delKids(spanObj);
	if (rn == '-') {
		obj.style.visibility = "hidden";
		rno.className = 'myField weissefarbe';
		// Bitte Reisenummer eingeben oder die <a href="suche.php" title="Zur Katalogreise-Suche">Reisesuche</a> benutzen.
		var textObj2 = document.createTextNode('Reisesuche');
		var textObj3 = document.createTextNode(' benutzen.');
		linkObj = document.createElement('a');
		linkObj.setAttribute('href','suche.php');
		linkObj.setAttribute('title','Zur Katalogreise-Suche');
		spanObj.appendChild(textObj);
		spanObj.appendChild(linkObj);
		spanObj.childNodes[1].appendChild(textObj2);
		spanObj.appendChild(textObj3);
		}
	else {
		land = xmlDocument.getElementsByTagName('land')[0].firstChild.data;
		if (land == '-') {
			// We got no data
			land = '';
			spanObj.appendChild(textObj);
			obj.style.visibility = "hidden";
			rno.className = 'myField fehlerfarbe';
			}
		else {
			// Link einsetzen
			linkObj = document.createElement('a');
			linkObj.setAttribute('href',xmlDocument.getElementsByTagName('file')[0].firstChild.data);
			linkObj.setAttribute('title','Zur Reisebeschreibung');
			spanObj.appendChild(linkObj);
			// MSIE mag es nicht wenn der Textknoten vor dem Einhängen angehängt wird
			spanObj.childNodes[0].appendChild(textObj);
			obj.style.visibility = "visible";
			rno.className = 'myField weissefarbe';
			von = xmlDocument.getElementsByTagName('von')[0].firstChild.data;
			bis = xmlDocument.getElementsByTagName('bis')[0].firstChild.data;
			preis = xmlDocument.getElementsByTagName('preis')[0].firstChild.data + ',-';
			}
		}
	obj = document.getElementById('f_reiseland');
	obj.value = land;
	obj = document.getElementById('f_reisevon');
	obj.value = von;
	obj = document.getElementById('f_reisebis');
	obj.value = bis;
	obj = document.getElementById('f_reisepreis');
	obj.value = preis;
	return;
}

function reiseDatenHttpState() {
	if (xmlhttp.readyState == 4) {
		if ( xmlhttp.status == 200) {
			// daten erfolgreich geladen: starte Verarbeitung
			reiseDaten();
		} else {
			alert("Fehler beim Abrufen der Reisedaten - Status " + xmlhttp.status);
			alert("Statusmeldung vom Server: " + xmlhttp.statusText);
		}
	}
	return;
}

// This is called at onBlur() of the reisenr-Field of the booking form
function neueReiseNr(val) {
	if (loading) return;
	xmlhttp = getXMLHttpRequest();
	// Call "reisedaten.php" on the server
	var url = '../scripts/reisedaten.php?rn=' + val;
	xmlhttp.open("GET", url, true);
	xmlhttp.onreadystatechange = reiseDatenHttpState;
	xmlhttp.send(null);
	return;
}

function dummyHttp() {
	return;
}

// This is a generic function to write an entry to the web log (zB onclick PDF-Anzeige)
function weblog(kuerzel,p1,p2) {
	if (loading) return;
	xmlhttp = getXMLHttpRequest();
	// Call "weblog.php" on the server
	var url = '../scripts/weblog.php?kl=' + kuerzel + '&p1=' + p1 + '&p2=' + p2;
	xmlhttp.open("GET", url, true);
	xmlhttp.onreadystatechange = dummyHttp;
	xmlhttp.send(null);
	return;
}
