/**
 * @author:	Ringo Leese
 * @version: 1.1.1
 * @constructor: new AjaxRequest();
 */
var HttpRequests = new Array();
function AjaxRequest()
{
	var HttpSendParams = null;
	var SyncMode = true;
	var Method = 'GET';
	var UrlParams = '';
	var LoadIconId = 'loadicon';
	var RequestIndex = 0;
	var CancelSameNamedRequests = false;
	var IgnoreSameNamedRequests = false;
	this.HttpObject = null;
	this.aborted = false;
	this.ajax_loader = true;
	this.Name = '';
	this.CompleteUrl = '';
	
	/**
	 * @param	{String}	Url - Die Url, die angefragt werden soll, muss angegeben werden
	 * @param	{Object}	Params - ein Object, welches zusätzliche Parameter enthalten kann
	 * @param	Params:
	 * 		{Boolean}	sync_mode					= Sync-Modus (true oder false [Standard: true])
	 * 		{String} 	method						= Methode ('GET' oder 'POST' [Standard: 'GET'])
	 * 		{String}	url_params					= Url-Parameter (kann optional übergeben werden, bei 'POST' aufruf, müssen die Parameter hierüber übergeben werden)
	 * 		{Boolean}	ajax_loader					= Ajax-Loader (true oder false gibt an, ob der Ladebalken angezeigt wird oder nicht [Standard: true])
	 * 		{String}	replace_container_id		= angeben, wenn das Ergebnis der Anfrage in einen Container geschrieben werden soll
	 * 		{Name}		callback					= Funktion, die nach dem abarbeiten des Requests ausgeführt werden soll
	 * 		{Object}	callback_parameters			= weitere Parameter, die mit zur Callback-Funktion übergeben werden können
	 * 		{String}	request_name				= gibt dem Request einen Namen, auf dem man später zugreifen kann
	 * 		{Boolean}	cancel_same_named_requests	= bricht alle Requests ab, die den gleichen Namen besitzen, wie der jetzige
	 * 		{Boolean}	ignore_same_named_requests	= startet den Request nicht, wenn bereits einer mit dem gleichen Namen läuft
	 * @param	Params.callback_parameters:
	 * 		{Boolean}	get_response	= gibt an, ob das Ergebnis mit an die Callback-Funktion übergeben werden soll (true oder false [Standard: false])
	 * 					@return	String		TextResult
	 * 
	 * 		{Boolean}	result_is_xml	= gibt an, ob das Ergebnis als XML-Objekt zurückgegeben wird (true oder false [Standard: false])
	 * 					@return XML-Objekt	XmlResult
	 * 
	 * 		{Boolean}	result_is_json	= gibt an, ob das Ergebnis als JSON-Objekt zurückgegeben wird (true oder false [Standard: false])
	 * 					@return JSON-Objekt	JsonResult
	 * 
	 * 		{Boolean}	result_is_text	= gibt an, ob das Ergebnis als Text zurückgegeben wird (true oder false [Standard: true])
	 * 					@return String		TextResult
	 * 
	 * 		Benutzerdefinierte Parameter mit beliebigen Namen und Werten!
	 */
	this.Send = function(Url, Params)
	{
		this.CompleteUrl = Url;
		
		if(Params)
		{
			if(Params.sync_mode)
				SyncMode = Params.sync_mode;
			if(Params.request_name && Params.request_name != '')
			{
				this.Name = Params.request_name;
				if(typeof Params.cancel_same_named_requests == 'boolean')
				{
					CancelSameNamedRequests = Params.cancel_same_named_requests;
				}
				if(typeof Params.ignore_same_named_requests == 'boolean')
				{
					IgnoreSameNamedRequests = Params.ignore_same_named_requests;
				}
			}
			if(Params.method)
			{
				switch(Params.method)
				{
					case 'GET':
						Method = Params.method;
						break;
					case 'POST':
						Method = Params.method;
						if(Params.url_params)
						{
							if(typeof Params.url_params == 'string')
							{
								HttpSendParams = Params.url_params;
							}
							else if(typeof Params.url_params == 'object')
							{
								var ParamCounter = 0;
								HttpSendParams = '';
								for(Param in Params.url_params)
								{
									if(ParamCounter != 0)
										HttpSendParams+= '&';
									HttpSendParams+= Param+'='+encodeURIComponent(Params.url_params[Param]);
									ParamCounter++;
								}
							}
						}
						break;
				}
			}
			if(Params.url_params && Method == 'GET')
			{
				UrlParams = '?'+Params.url_params;
				this.CompleteUrl+= UrlParams;
			}
			
			if(typeof Params.ajax_loader == 'boolean' && Params.ajax_loader == false)
			{
				this.ajax_loader = false;
			}
		}//Eo if(params)
		
		if(CancelSameNamedRequests == true)
		{
			for(var i = 0; i < HttpRequests.length; i++)
			{
				if(typeof HttpRequests[i] == 'object' && HttpRequests[i].Name == this.Name && HttpRequests[i].HttpObject.readyState < 4)
				{
					HttpRequests[i].HttpObject.abort();
					HttpRequests[i].aborted = true;
					
					delete HttpRequests[i];
				}
			}
		}
		
		if(IgnoreSameNamedRequests == true)
		{
			for(var i = 0; i < HttpRequests.length; i++)
			{
				if(typeof HttpRequests[i] == 'object' && HttpRequests[i].Name == this.Name && HttpRequests[i].HttpObject.readyState < 4)
				{
					return;
				}
			}
		}
		
		this.HttpObject = CreateObject();
		HttpRequests.push(this);
		RequestIndex = HttpRequests.length - 1;
		
		this.HttpObject.open(Method, Url+UrlParams, SyncMode);
		this.HttpObject.onreadystatechange = function()
		{
			if(HttpRequests[RequestIndex].HttpObject.readyState == 4)
			{
				if(HttpRequests[RequestIndex].HttpObject.status == 200)
				{
					if(Params)
					{
						if(Params.replace_container_id)
						{
							var Container = document.getElementById(Params.replace_container_id);
							if(Container)
							{
								Container.innerHTML = '';
								Container.innerHTML = HttpRequests[RequestIndex].HttpObject.responseText;
							}
						}
						
						if(Params.callback && typeof Params.callback == 'function')
						{
							if(Params.callback_parameters)
							{
								// Der ResultText wird Standardmäßig immer mit übergeben
								if(!(Params.callback_parameters.get_response && Params.callback_parameters.get_response == false))
								{
									if(Params.callback_parameters.result_is_xml && Params.callback_parameters.result_is_xml == true)
									{
										Params.callback_parameters.XmlResult = HttpRequests[RequestIndex].HttpObject.responseXML;
									}
									else
									if(Params.callback_parameters.result_is_json && Params.callback_parameters.result_is_json == true)
									{
										try
										{
											Params.callback_parameters.JsonResult = eval('(' + HttpRequests[RequestIndex].HttpObject.responseText + ')');
										}
										catch(e)
										{
											var ErrorMessage = 'JSON: '+e.name+'\n\n';
												ErrorMessage+= L_SEND_SUPPORT_EMAIL_QUESTION;
											if(confirm(ErrorMessage))
											{
												SendSupportEmail({
													called_script: HttpRequests[RequestIndex].CompleteUrl,
													error_message: 'JSON: '+e.name,
													response_text: HttpRequests[RequestIndex].HttpObject.responseText
												});
											}
											Params.callback_parameters.JsonResult = new Object();
										}
									}
									else
									{
										Params.callback_parameters.TextResult = HttpRequests[RequestIndex].HttpObject.responseText;
									}

									if(Params.callback_parameters.result_is_text && Params.callback_parameters.result_is_text == true)
									{
										Params.callback_parameters.TextResult = HttpRequests[RequestIndex].HttpObject.responseText;
									}
								}
								// Callback-Funktion aufrufen
								try
								{
									Params.callback(Params.callback_parameters);
								}
								catch(e)
								{
									if(typeof console == 'object')
										console.error(e);
								}
							}
							else
							{
								try
								{
									Params.callback();
								}
								catch(e)
								{
									if(typeof console == 'object')
										console.error(e);
								}
							}
						}
					}
				} else
				{
					if(typeof console == 'object')
					{
						console.error('Request Error Status: '+HttpRequests[RequestIndex].HttpObject.status+' - '+HttpRequests[RequestIndex].HttpObject.statusText+' ('+Url+')');
					}
				}
				removeLoader();
				
				delete HttpRequests[RequestIndex];
			} else
			if((HttpRequests[RequestIndex].HttpObject.readyState == 1 || HttpRequests[RequestIndex].HttpObject.readyState == 2) &&  HttpRequests[RequestIndex].ajax_loader == true) // readyState == 2 für Opera und Safari
			{
				buildLoader();
			}
		}
		if(Method == 'POST')
		{
			this.HttpObject.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		}
		
		this.HttpObject.send(HttpSendParams);
	}
	
	function CreateObject()
	{
		if (navigator.appName == "Microsoft Internet Explorer")
			return new ActiveXObject("Microsoft.XMLHTTP");
		else
			return new XMLHttpRequest();
	}
	
	function buildLoader()
	{
		if(!document.getElementById(LoadIconId))
		{
			var LoaderWidth = 378;
			var LoaderHeight = 66;
			var ScreenWidth = 0;
			
			if(HttpRequests[RequestIndex].ajax_loader == true)
				document.body.style.cursor = 'wait';
			
			if(document.getElementById('LOCR_CONTENT_HEADER_NAVIGATION'))
				document.getElementById('LOCR_CONTENT_HEADER_NAVIGATION').style.zIndex = '';
			
			var Loader = document.createElement('div');
				Loader.setAttribute('id', LoadIconId);
				Loader.style.backgroundImage = 'url(/gfx/gif/ajax-new_loader.gif)';
				Loader.style.width = LoaderWidth+'px';
				Loader.style.height = LoaderHeight+'px';
			
				Loader.style.left = parseInt(GetScreenWidth() / 2) - parseInt(LoaderWidth / 2) + 'px';
				Loader.style.top = parseInt(GetScreenHeight() / 2) - parseInt(LoaderHeight / 2) + 'px';
				
			window.onresize = function() {
				if(document.getElementById(LoadIconId))
				{
					document.getElementById(LoadIconId).style.left = parseInt(GetScreenWidth() / 2) - parseInt(LoaderWidth / 2) + 'px';
					document.getElementById(LoadIconId).style.top = parseInt(GetScreenHeight() / 2) - parseInt(LoaderHeight / 2) + 'px';
				}
			}
			
			document.body.appendChild(Loader);
			
			if(!document.getElementById('LoadingShadow'))
			{
				var Layer = document.createElement('div');
					Layer.setAttribute('id', 'LoadingShadow');
				document.body.appendChild(Layer);
			}
		}
	}
	
	function removeLoader()
	{
		if(document.getElementById(LoadIconId))
		{
			var DestroyLoader = true;
			for(var i = 0; i < HttpRequests.length; i++)
			{
				if(HttpRequests[RequestIndex].ajax_loader == true && (typeof HttpRequests[i] == 'object' && HttpRequests[i].HttpObject.readyState < 4 && HttpRequests[i].ajax_loader == true))
				//if(HttpRequests[i].HttpObject.readyState < 4 && AjaxLoader == true)
				{
					DestroyLoader = false;
					break;
				}
			}
			
			if(DestroyLoader == true)
			{
				parent.parent.document.body.style.cursor = 'default';
				
				if(document.getElementById('LOCR_CONTENT_HEADER_NAVIGATION'))
					document.getElementById('LOCR_CONTENT_HEADER_NAVIGATION').style.zIndex = '999';
				
				document.body.removeChild(document.getElementById(LoadIconId));
				
				if(document.getElementById('LoadingShadow'))
				{
					document.body.removeChild(document.getElementById('LoadingShadow'));
				}
			}
		}
	}
}

function SendSupportEmail(Params)
{
	var Url = '/functions/ajax/send_support_email.php';
	var Request = new AjaxRequest();
		Request.Send(Url, {
			method: 'POST',
			url_params: {
				called_script: Params.called_script,
				error_message: Params.error_message,
				response_text: Params.response_text
			},
			callback_parameters: {
				get_result: true
			},
			callback: function(Params) {
				alert(Params.TextResult);
			}
		});
}

