Ajax=function(addrandomnumber, filetype)
{
	this.basedomain='http://'+location.hostname;
	this.filetype=(filetype!=undefined ? filetype : 'txt');
	this.addrandomnumber=(addrandomnumber!=undefined ? addrandomnumber : false);
	
	this.ajaxobj=false;
	if (window.ActiveXObject) // if IE
	{
		try{
			this.ajaxobj=new ActiveXObject("Msxml2.XMLHTTP");
		}catch (err)
		{
			try{
				this.ajaxobj=new ActiveXObject("Microsoft.XMLHTTP");
			}catch (err) {}
		}
	}
	else if (window.XMLHttpRequest) // if Mozilla, Safari etc
	{
		this.ajaxobj=new XMLHttpRequest();
		if (this.ajaxobj.overrideMimeType);
			this.ajaxobj.overrideMimeType(this.filetype=='xml' ? 'text/xml' : 'text/plain');
	}
}

Ajax.prototype.get=function(url, callbackfunc)
{
	if (this.addrandomnumber) // To stop IE caching
		var url=url+(url.indexOf('?')!= -1 ? '&' : '?')+"ts="+new Date().getTime();
	if (this.ajaxobj)
	{
		this.ajaxobj.onreadystatechange=callbackfunc;
		this.ajaxobj.open('GET', url, true);
		this.ajaxobj.send(null);
	}
}

Ajax.prototype.post=function(url, parameters, callbackfunc, enctype)
{
	if (this.ajaxobj)
	{
		this.ajaxobj.onreadystatechange = callbackfunc;
		this.ajaxobj.open('POST', url, true);
		if(!!enctype)
			this.ajaxobj.setRequestHeader("Content-type", enctype);
		else
			this.ajaxobj.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		this.ajaxobj.setRequestHeader("Content-length", parameters.length);
		this.ajaxobj.setRequestHeader("Connection", "close");
		this.ajaxobj.send(parameters);
	}
}

Ajax.prototype.request=function(url, parameters, calltype, callbackfunc)
{
	if(calltype.toLowerCase()=='post')
		this.post(url, parameters, callbackfunc);
	else
		this.get(url+'?'+parameters, callbackfunc);
}

Ajax.prototype.ready=function()
{
	return (this.ajaxobj.readyState == 4);
}

Ajax.prototype.status=function()
{
	return (this.ajaxobj.status);
}

Ajax.prototype.response=function()
{
	return (this.filetype=='txt' ? this.ajaxobj.responseText : this.ajaxobj.responseXml);
}

function handleAjaxForm(form, onsuccess, onfailure)
{
	var ajax=new Ajax(true, 'txt');
	
	var params='';
	for(var i=0; i<form.elements.length; i++)
	{
		if(!!form.elements[i].name && form.elements[i].name != '')
		{
			if(form.elements[i].type.toLowerCase()=='select-multiple')
			{
				var opts='';
				for(var j=0; j<form.elements[i].options.length; j++)
				{
					if(form.elements[i].options[j].selected)
						opts+=(opts==''? '': ',')+escape(form.elements[i].options[j].value).replace(/\+/g, '%2B');
				}
				params += escape(form.elements[i].name)+'='+opts+'&';
			}
			else if(form.elements[i].type.toLowerCase()!='checkbox' || form.elements[i].checked)
				params += escape(form.elements[i].name)+'='+escape(form.elements[i].value).replace(/\+/g, '%2B')+'&';
		}
	}
	
	ajax.request(form.action, params, form.method, function()
	{
		if(ajax.ready())
		{
			if(ajax.status()==200)
			{
				// Debug
				// alert(ajax.response());
				try{
					resp=JSON.parse(ajax.response());
					
				}
				catch(err)
				{
					alert('Error parsing AJAXs: '+ajax.response());	
					//return;
				}
				if(resp.success)
				{
					if(!!onsuccess)
						onsuccess(resp);
				}
				else
				{
					if(!!onfailure)
						onfailure(resp);
					if(!!resp.msg)
						alert('Error: '+resp.msg);
				}
			}
			else if(ajax.status()!=0)				
				alert('HTTP Error '+ajax.status()+'\n\n'+ajax.response());
		}
	}, form.enctype);
	
	return false;
}
