var loadedScripts = new Array();
var ajax_loaders_count = 0;

Function.prototype.bind = function(object) {
    var method = this
    return function() {
        return method.apply(object, arguments) 
    }
}

var ajax_request = function () {};
ajax_request.prototype =
{
	req : null,
	target : null,
	url : null,
	callback : null,
	settings :
	{	
	},
	
	ajax_request: function ()
	{
	
	},
	
	getTransport : function ()
	{
		this.req = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
	},
	
	get : function (what,where)
	{
		if(this.target = document.getElementById(where))
		{
			this.getTransport();
			this.req.onreadystatechange = this.complete.bind(this);
			this.req.open("POST",what,true);
			this.req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
			this.req.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
			this.req.send("ajax_engine=1");
			ajax_loaders_count++;
			this.updateIndicator();
		}
	},
	
	getByCallback : function(what,callback)
	{
			this.callback = callback;
			this.getTransport();
			this.req.onreadystatechange = this.jsonCallback.bind(this);
			this.req.open("POST",what,true);
			this.req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
			this.req.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
			this.req.send("ajax_engine=1");
			ajax_loaders_count++;
			this.updateIndicator();
	},
	
	postByCallback : function(what,callback,data)
	{
			this.callback = callback;
			this.getTransport();
			this.req.onreadystatechange = this.jsonCallback.bind(this);
			this.req.open("POST",what,true);
			this.req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
			this.req.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
			/*if(data!=""){
				data="ajax_engine=1&"+data;
			}else{
				data="ajax_engine=1"
			}*/
			this.req.send(data);
			ajax_loaders_count++;
			this.updateIndicator();
	},
	
	post : function (what,where,data)
	{
		if(this.target = document.getElementById(where))
		{
			this.getTransport();
			this.req.onreadystatechange = this.complete.bind(this);
			this.req.open("POST",what,true);
			this.req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
			this.req.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
			/*if(data!=""){
				data="ajax_engine=1&"+data;
			}else{
				data="ajax_engine=1"
			}*/
			this.req.send(data);
			ajax_loaders_count++;
			this.updateIndicator();
		}
	},
	
	complete : function ()
	{
		if(this.req.readyState == 4)
		{
			if(this.target)
			{
				this.target.innerHTML = '&nbsp;';
				this.target.innerHTML = this.req.responseText;
			}
			this.clean();
			ajax_loaders_count--;
			this.updateIndicator();
		}
	},
	
	jsonCallback : function ()
	{
		
		if(this.req.readyState == 4)
		{
			
			var obj = new Function("","return " + this.req.responseText);
			
			var myObj = null;
			
			if(myObj = obj())
			{
				this.callback(myObj);
			}
			
			this.clean();
			ajax_loaders_count--;
			this.updateIndicator();
			
		}
	},
	
	processScripts: function ()
	{
		var scripts = this.target.getElementsByTagName('script');
		var i=0;
		for(i=0;i<scripts.length;i++)
		{
			if((scripts[i].getAttribute('src') != null && scripts[i].getAttribute('src') != '') && loadedScripts[scripts[i].getAttribute('src')] != 1)
			{
			    span = document.body.appendChild(document.createElement("SPAN"));
			    span.style.display = 'none';
			    span.innerHTML = 'Text for stupid IE.<s'+'cript></' + 'script>';
			    span.getElementsByTagName('script')[0].src = scripts[i].getAttribute('src');
			    loadedScripts[scripts[i].getAttribute('src')] = 1;
			} else
			{
				eval(scripts[i].text);
			}
			
		}
	},
	
	updateIndicator : function ()
	{
		var ind = null;
		if(ind = document.getElementById('loadingIndicator'))
		{
			if(ajax_loaders_count > 0)
			{
				ind.style.display = '';
				//alert(ind.style.top);
				//screen.width
			} else
			{
				ind.style.display = 'none';
			}
		}
	},
	
	clean : function()
	{
		this.req.onreadystatechange = function () {};
		this.req = null;
	},
	
	setForm : function(formel)
	{
		var _sFormData = '';
		var oForm = formel;
		var oElement, elName, elValue;
		// iterate over the form elements collection to construct the
		// label-value pairs.
		for (var i=0; i<oForm.elements.length; i++){
			oElement = oForm.elements[i];
			elName = oForm.elements[i].name;
			elValue = oForm.elements[i].value;
			switch (oElement.type)
			{
				case 'select-multiple':
					for(var j=0; j<oElement.options.length; j++){
						if(oElement.options[j].selected){
							_sFormData += encodeURIComponent(elName) + '=' + encodeURIComponent(oElement.options[j].value) + '&';
						}
					}
					break;
				case 'radio':
				case 'checkbox':
					if(oElement.checked){
						_sFormData += encodeURIComponent(elName) + '=' + encodeURIComponent(elValue) + '&';
					}
					break;
				case 'file':
				// stub case as XMLHttpRequest will only send the file path as a string.
					break;
				case undefined:
				// stub case for fieldset element which returns undefined.
					break;
				default:
					_sFormData += encodeURIComponent(elName) + '=' + encodeURIComponent(elValue) + '&';
					break;
			}
		}
		_sFormData = _sFormData.substr(0, _sFormData.length - 1);
		return(_sFormData);
	
	},
	
	convertData : function(data,string)
	{
		if(string===undefined)
		{
			var outString=this.convertData(data,'');
			outString = outString.substr(0, outString.length - 1);
			return outString;
		}
		if(typeof(data)=="object")
		{
			var outString="";
			var sendString
			for(k in data){
				if(string==''){
					sendString=k;
				}else{
					sendString=string+'['+k+']';
				}
				outString=outString+this.convertData(data[k],sendString);
			}
		}
		else
		{
			var outString=string+"="+encodeURIComponent(data)+"&";
		}
		return outString;
	}
}

function ajax_loadInto(lnk,container_id)
{
	var req = new ajax_request();
	req.get(lnk,container_id);
	return(false);
}

function ajax_postForm(lnk,container_id,formel)
{
	var req = new ajax_request();
	req.post(lnk,container_id,req.setForm(formel));
	return(false);
}

function ajax_loadIntoCallback(lnk,callback)
{
	var req = new ajax_request();
	req.getByCallback(lnk,callback);
	return(false);
}

function ajax_postIntoCallback(lnk,callback,formel)
{
	var req = new ajax_request();
	req.postByCallback(lnk,callback,req.setForm(formel));
	return(false);
}

function ajax_postData(lnk,container_id,data)
{
	var req = new ajax_request();
	req.post(lnk,container_id,req.convertData(data));
	return(false);
}

function ajax_postDataCallback(lnk,callback,data)
{
	var req = new ajax_request();
	req.postByCallback(lnk,callback,req.convertData(data));
	return(false);
}



