/*
	----------------------------------------------------------------------------------
	class AJAX
	
	(c) 2007, MeteoNews AG, Simon Hänggi
	
	HOW TO USE:
	var ajax       = new AJAX();
	ajax.response  = "txt";                //optional (txt, json or xml), default is txt
	ajax.url       = "test.php?task=txt";  //script to call
	ajax.method    = "GET";                //optional (GET or POST), default is GET
	ajax.params    = "";                   //needed with POST method
	ajax.onSuccess = f_txt;                //function to call
	ajax.onError   = error;                //optional, default is an alert box
	ajax.asynch    = false;                //optional, default is true
	ajax.doRequest();                      //starts the requests
	
	
	HISTORY
	2007-08-08 First release
	2007-08-21 var number eingefügt --> _this.onSuccess(..., _this.number);
	2008-01-03 asynch eingeführt
	2008-01-10 try catch beim readystatehandler eingefügt
	2008-01-15 tries eingeführt, dass heisst derselbe Request wird 3 mal losgeschickt
	           bevor eine Fehlermeldung generiert wird.
	2008-02-06 try und catch eingeführt, beim json response
	----------------------------------------------------------------------------------
*/


function AJAX() 
{ 
  	this.response  = "txt"; //xml, json, txt
  	this.url       = ""; 
   	this.method    = "GET";
   	this.params    = "";
  	this.onSuccess = null; 
  	this.onError   = function(nr, msg) {alert(nr + ": " + msg);}
  	this.asynch    = true;
  	this.run       = 3; //request wird im ganzen 3 + 1 Mal geschickt!
  	this.number;
} 


/*
	doRequest
*/
AJAX.prototype.doRequest = function() 
{ 
	//Zugriff auf Klasse für readyStateHandler ermöglichen 
  	var _this = this;
    
    if(!_this.url) 
  	{ 
    	_this.onError(5, "classAJAX::doRequest() Es wurde keine URL angegeben. Der Request wird abgebrochen.");
  		return false; 
  	} 
  	
  	if(!_this.method) //Standard method ist GET
  	   	_this.method = "GET"; 
  	else 
  	   	_this.method = this.method.toUpperCase(); 
  	
  	if(!_this.response) //Standard response ist txt
  		_this.response = "txt";
  	else
  		_this.response = this.response.toLowerCase();
  	
   	var xmlHttpRequest = getXMLHttpRequest(); //XMLHttpRequest-Objekt erstellen  
  	if(!xmlHttpRequest) 
  	{ 
    	_this.onError(5, "classAJAX::doRequest() Es konnte kein XMLHttpRequest-Objekt erstellt werden."); 
    	return false;
  	}
  	
  	console.log("  -> " + this.run + " | " + this.method + " | " + this.url + " | " + this.params.slice(0, 40) );
  	
  	//Fallunterscheidung nach Ueàbertragungsmethode 
  	switch(this.method) 
  	{ 
    	case "GET":  xmlHttpRequest.open(this.method, this.url, this.asynch); 
        	         xmlHttpRequest.onreadystatechange = _readyStateHandler; 
            	     xmlHttpRequest.send(null);
            	     //__ajax_request = true; //????????????
        break;
    	case "POST": xmlHttpRequest.open(this.method, this.url, this.asynch); 
        	         xmlHttpRequest.onreadystatechange = _readyStateHandler; 
            	     xmlHttpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
                	 xmlHttpRequest.send(this.params);
                	 //__ajax_request = true; //??????????????
        break;
        default:	 this.onError(5, "classAJAX::doRequest() method must be GET or POST!");
  	}
  	
  	//Private Methode zur Verarbeitung der erhaltenen Daten 
  	function _readyStateHandler() 
  	{ 
    	if(xmlHttpRequest.readyState < 4) 
			return null;
		if(xmlHttpRequest.status == 200 || xmlHttpRequest.status == 304) 
		{
			if(_this.onSuccess) 
			{
				//__ajax_request = false; //?????????
				
				if(_this.response == 'txt')
					_this.onSuccess(xmlHttpRequest.responseText, _this.number);
				else if(_this.response == 'xml')
					_this.onSuccess(xmlHttpRequest.responseXML, _this.number);
				else if(_this.response == 'json')
				{
					try
					{
						var myFunc = new Function("return " + xmlHttpRequest.responseText);
						var myJSON = myFunc();
						
						if(myJSON.dbError)
							_this.onError(2, "[" + _this.url + "]\r\n" + xmlHttpRequest.responseText);
						else if(myJSON.error != undefined)
							_this.onError(myJSON.error, "[" + _this.url + "]\r\n" + xmlHttpRequest.responseText + "\r\n" + xmlHttpRequest.status + "\r\n" + xmlHttpRequest.statusText);
						else
							_this.onSuccess(myJSON, _this.number);
					}
					catch(e)
					{
						_this.onError(5, "classAJAX::doRequest() Beim AJAX Request ist folgender Fehler aufgetreten: \r\n\r\n[" + _this.url + "]\r\n" + xmlHttpRequest.responseText + ", " + xmlHttpRequest.status + ", " + xmlHttpRequest.statusText + "\r\n" + e);
					}
				}
				else
				{
					_this.onError(5, "classAJAX::doRequest() response type not defined!");
				}
			}
		}
		else //error z.b. 404 not found or 503 service unavailable
		{
			if(--_this.run >= 0)
			{
				pausecomp(1000); //pause von 1s
				_this.doRequest(); //request nochmals abschicken
			}
			else if(_this.onError) //erst nach mehreren Versuchen wird abgebrochen
			{
				_this.onError(3, "classAJAX::doRequest() Es trat ein Fehler bei der AJAX Datenuebertragung auf! [" + _this.url + ": " + xmlHttpRequest.status + ", " + xmlHttpRequest.statusText + "]");
			}
		}
  	}
}


/*
	getXMLHttpRequest
*/
function getXMLHttpRequest() 
{
	if(window.XMLHttpRequest) 
	{ 
    	//XMLHttpRequest für Firefox, Opera, Safari, ... 
    	return new XMLHttpRequest(); 
  	} 
  	else if(window.ActiveXObject) 
  	{
    	try 
    	{   
      		//XMLHTTP (neu) für Internet Explorer 
      		return new ActiveXObject("Msxml2.XMLHTTP"); 
    	} 
    	catch(e) 
    	{
      		try 
      		{
        		//XMLHTTP (alt) für Internet Explorer 
        		return new ActiveXObject("Microsoft.XMLHTTP");  
      		} 
      		catch(e)
      		{ 
      			return null; 
      		}
    	}
  	}
  	return null; 
}
