/********************************
* SAJAX 0.2						*
* 2006-11-10					*
*								*
* (C) Christian Müller			*
* christian@scootertreff.de		*
*********************************/

timestampRequestUrl		=	"";

/**************************************************************************************************************************************
* DONT CHANGE ANYTHING BELOW THIS LINE
**************************************************************************************************************************************/

/**
* SAJAX-Objekt
*
* @author	Christian Müller
* @version	1.0
*/
function sajax() 
{
	//Konfiguration ins Objekt übernehmen
	this.serverTimestampUrl		= 	timestampRequestUrl;
	
	//Interne Variablen
	this.loopCallCount = 1;
	this.loopCallCheck = new Array();
	
	//SAJAX-Methoden generieren
	this.init				=	init;
	this.sendRequest 		= 	sendRequest;
	this.loadScript			= 	loadScript;
	this.updateObj			= 	updateObj;
	this.updateObjById		=	updateObjById;
	this.getServerTime		= 	getServerTime;
	this.callRequestLoop	= 	callRequestLoop;
	this.getLoopCallCount	= 	getLoopCallCount;
	this.stopRequestLoop	= 	stopRequestLoop;
	this.browser			=	getBrowser;
	
	bwsr = this.browser();
	browser 		= bwsr[0];
	browserVersion 	= bwsr[1];
	
	//Warteschlangenobjekt
	//this.queue = new queue();
	//this.queue.checkInterval = queueCheckInterval;
}

/**
* Sendet eine Anfrage an den Server und gibt den Rückgabewert des Servers aus
*
* @author	Christian Mueller
* @version	1.0
* @param	String	requestedUrl	Beim Server angefragte Datei
* @param	Bollean	
* @return	String	Rückgabewert vom Server
**/ 
function sendRequest(requestedUrl, orsc){
	orsc_code = orsc || false;

	urlPieces = requestedUrl.split("?");

	//Nur das erste Fragezeichen zählt, wenn mehr als zwei Teile, alle nach dem ersten zu einem zusammen setzen
	if(urlPieces.length > 2)
	{
		var param = "";
		for(i=1;i<urlPieces.length;i++)
		{
			param = param +"?"+ urlPieces[i];
		}
		urlPieces[1] = param.substring(1);
	}
	else
		urlPieces[1] = urlPieces[1];
		
	//alert(orsc_code);
	
//	if(orsf == false)
//	{

	
	var oXML=null
	if (window.XMLHttpRequest)
	{
		oXML=new XMLHttpRequest()
	}
	else if (window.ActiveXObject)
	{
		oXML=new ActiveXObject("Microsoft.XMLHTTP")
	}
	
	// Wenn eine onReadyStateChange-Funktion vorhanden
	if(orsc_code != false)
	{
		oXML.onreadystatechange = function () {
			
			if (oXML.readyState == 4)
			{
				if (oXML.status == 200)
				{	
					eval(orsc_code);
				}
				else
					alert(oXML.status)
			}
		}
	}
	
	if(urlPieces[1] == 'undefined')
	{
		try{
			oXML.open('GET', urlPieces[0], true);
		}
		catch(b)
		{
			alert(b);
		}
		
		oXML.send(null);
	}
	else
	{
		try{
			oXML.open('POST', urlPieces[0], true);
			oXML.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			oXML.setRequestHeader( 'Content-length', urlPieces[0].length );
			oXML.send(urlPieces[1]);
		}
		catch(b)
		{
			window.location.href = urlPieces[0]+"?"+urlPieces[1]+"&noAjax=1";
			//alert(urlPieces[0]+"?"+urlPieces[1]+"&noAjax=1");
		}
	}
	
	if(orsc_code == false)
		return oXML.responseText;
	/*
	}
	else
	{
		if(urlPieces[1] == 'undefined')
		{
			var oXML = getXMLHttpObj();
			oXML.onreadystatechange = function () {
				if (oXML.readyState == 4)
				{
					if (oXML.status == 200)
					{	
						eval(orsf);
					}
				}
			}
			oXML.open('GET', requestedUrl, true);
			oXML.send(null);
	}
	*/
}

/**
* Includet weitere JS-Dateien
*
* @author	Christian Mueller
* @version	1.0
**/
function includeFiles(){
	
}

/**
* Ersetzt den Wert objVal des Objektes obj
*
* @author	Christian Müller
* @version	1.0
* @param	Object	obj	Objekt dessen Feld geändert werden soll
* @param	String	requestedUrl	URL für den Request
* @param	String	objVal	Eigenschaftsname der den Request-Rückgabewert zugewiesen bekommen soll
**/
function updateObj(obj, requestedUrl, orsc, objVal){
	//Eigenschaftsname übernehmen oder Standardwert setzen
	objValue = objVal || 'innerHTML';
	G_obj = obj;
	orsc_code = orsc || 'G_obj.'+objValue+' = oXML.responseText;';
	
	//Request absetzen und Wert der Eigenschaft zuweisen
	eval('this.sendRequest(requestedUrl , orsc_code);');
}

/**
* Ersetzt den Wert objVal des Objektes obj
*
* @author	Christian Müller
* @version	1.0
* @param	String	objId	ID des Objektes dessen Eigenschaft geändert werden soll
* @param	String	requestedUrl	URL für den Request
* @param	String	objVal	Eigenschaftsname der den Request-Rückgabewert zugewiesen bekommen soll
**/
function updateObjById(objId, requestedUrl, orsc, objVal){
	this.updateObj(document.getElementById(objId), requestedUrl, orsc, objVal);
}

/**
* Holt die Serverzeit und gibt sie zurück
*
* @author	Christian Müller
* @version	1.0
* @return	Integer	Unix-Timestamp der Serverzeit
**/
function getServerTime(){
	return this.sendRequest(this.serverTimestampUrl);
}

/**
* Ruft einen Request mit Verzögerung immer wieder auf und übermittelt den Wert an eine Eigenschaft eines Objektes
*
* @author	Christian Müller
* @version	1.0
* @param	Object	Betroffenes Objekt
* @param	String	requestedUrl	URL für den Request
* @param	String	objVal	Eigenschaftsname der den Request-Rückgabewert zugewiesen bekommen soll
* @param	delay	Verzögerung mit der die Funktion aufgerufen werden soll
* @param	delay	Interner Parameter zum Zählen der Durchläufe
* @return	Integer	Fortlaufende callRequestNummer
**/
function callRequestLoop(obj, requestedUrl, objVal, delay, count, loopNumber){
	callDelay = delay || 1;
	countLoopings = count || 1;
	loopNum = loopNumber || "";
	
	// Wenn Loop-Num nicht existiert, setzen!
	if(loopNum == "")
	{
		loopNum = this.getLoopCallCount();
		this.loopCallCheck[loopNum] = true;
	}

	// Wenn Loop noch aktiv
	if(this.loopCallCheck[loopNum] == true)
	{
		//Globale Variablen schaffen (ist für setTimeout notwendig)
		G_tmp_obj = obj;
		G_tmp_requestedUrl = requestedUrl;
		G_tmp_objVal = objVal;
		G_tmp_delay = delay;
		G_tmp_countLoopings = countLoopings;
		G_tmp_loopNum = loopNum;
	
		//Request ausführen
		updateObj(obj, requestedUrl, false, objVal);
		
		//Nach x Sekunden callRequestLoop erneut aufrufen
		setTimeout("sajax.callRequestLoop(G_tmp_obj, G_tmp_requestedUrl, G_tmp_objVal, G_tmp_delay, (G_tmp_countLoopings+1), G_tmp_loopNum)", ((callDelay)*1000));
		
		//Beim ersten Aufruf (der noch manuell erfolgt) einen Rückegabewert zurückgeben
		if(countLoopings == 1)
		{
			return loopNum;
		}
	}
}

/**
* Zählt die Loop-Nummer um eins hoch und gibt die Loop-Nummer-1 zurück
*
* @author	Christian Müller
* @version	1.0
* @return	Integer	Loop-Nummer
**/
function getLoopCallCount(){
	i = this.loopCallCount;
	this.loopCallCount++;
	return i;
}

/**
* Hält einen RequestLoop an
* Setzt eine Variable, die vom Loop geprüft wird auf false, so dass die Schleife unterbrochen wird
*
* @author	Christian Müller
* @version	1.0
* @param	Integer	loopNum	Loop-Nummer
**/
function stopRequestLoop(loopNum){
	this.loopCallCheck[loopNum] = false;
}


/**
* Request-Objekt
*
* @return	null
* @url	http://www.webreference.com/programming/javascript/mk/
**/
function getXMLHttpObj(){
	if(typeof(XMLHttpRequest)!='undefined')
		return new XMLHttpRequest();

	var axO=['Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.4.0',
		'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP'], i;
	for(i=0;i<axO.length;i++)
		try{
			return new ActiveXObject(axO[i]);
		}catch(e){}
	return null;
}

/**
* Holt JavaScript-Dateien und Funktionen
* Hinweis: Der dritte Parameter von oXML.open dient dazu festzulegen, ob der restliche JavaScript-Code beim Laden anhält (false)
* oder ob der JS-Code einfach weiterläuft während die Daten geladen werden (true)
*
* @param	String	scriptpath	Relativer oder absoluter Pfad zur .js-Datei die included werden soll
* @param	Array	functions	Array mit allen zu includenden Funktionen
* @see	getXMLHttpObj()
* @url	http://www.webreference.com/programming/javascript/mk/
**/
function loadScript(scriptpath, functions){
	var oXML = getXMLHttpObj();
	oXML.open('GET', scriptpath, false);
	oXML.send('');
	eval(oXML.responseText);
	for(var i=0; i<functions.length; i++)
		window[functions[i]] = eval(functions[i]);
}

function getBrowser()
{
	var detect = navigator.userAgent.toLowerCase();
	var OS,browser,version,total,thestring;
	var browser,version;
	
	if (checkIt('konqueror'))
	{
		browser = "Konqueror";
		OS = "Linux";
	}
	else if (checkIt('safari')) browser = "Safari"
	else if (checkIt('omniweb')) browser = "OmniWeb"
	else if (checkIt('opera')) browser = "Opera"
	else if (checkIt('webtv')) browser = "WebTV";
	else if (checkIt('icab')) browser = "iCab"
	else if (checkIt('msie')) browser = "Internet Explorer"
	else if (!checkIt('compatible'))
	{
		browser = "Netscape Navigator"
		version = detect.charAt(8);
	}
	else browser = "An unknown browser";
	
	if (!version) version = detect.charAt(place + thestring.length);
	
	if (!OS)
	{
		if (checkIt('linux')) OS = "Linux";
		else if (checkIt('x11')) OS = "Unix";
		else if (checkIt('mac')) OS = "Mac"
		else if (checkIt('win')) OS = "Windows"
		else OS = "an unknown operating system";
	}
	
	function checkIt(string)
	{
		place = detect.indexOf(string) + 1;
		thestring = string;
		return place;
	}
	
	return new Array(browser, version);
}

/**************************************************************************************************************************************
* 
**************************************************************************************************************************************/

// Ajax-Objekt Initialisierung 
sajax = new sajax();

/*******************************************************
* See also:
*
* http://www.webreference.com/programming/javascript/mk/
* http://www.html-world.de/program/js_6.php (german)
********************************************************/
