function ServerRequest()
{
	var obj = new Object();
	
	obj.url = null;
	obj.method = "POST";
	obj.synchronous = true;
	obj.username = null;
	obj.password = null;
	obj.parameters = new Object();
	obj.headers =  new Object();
	obj.responseReceived = false;
	obj.queryString = "";
	obj.timeout = 0;
	obj.noCacheGetRequest = true;
	obj.aborted = false;
	
	obj.responseText = null;
	obj.responseXML = null;
	obj.status = null;
	obj.statusText = null;
	
	obj.onTimeout = null;
	obj.onLoading = null;
	obj.onLoaded = null;
	obj.onInteractive = null;
	obj.onComplete = null;
	obj.onSuccess = null;
	obj.onError = null;

	obj.onLoadingHandlerActive = false;
	obj.onLoadedHandlerActive = false;
	obj.onInteractiveHandlerActive = false;
	obj.onCompleteHandlerActive = false;	

	obj.xmlHttpRequest = ServerRequest.getXMLHTTPRequestObject();
	if(!obj.xmlHttpRequest)
	{
		return false;
	}
	
	obj.xmlHttpRequest.onreadystatechange = function()
											{
												if(!obj || !obj.xmlHttpRequest)
												{
													return false;
												}
												if(obj.xmlHttpRequest.readyState == 1 && !obj.onLoadingHandlerActive)
												{
													obj.onLoadingHandler(obj);
												}
												if(obj.xmlHttpRequest.readyState == 2 && !obj.onLoadedHandlerActive)
												{
													obj.onLoadedHandler(obj);
												}
												if(obj.xmlHttpRequest.readyState == 3 && !obj.onInteractiveHandlerActive)
												{
													obj.onInteractiveHandler(obj);
												}
												if(obj.xmlHttpRequest.readyState == 4 && !obj.onCompleteHandlerActive && !obj.aborted)
												{
													obj.onCompleteHandler(obj);
												}
											}
	
	obj.onLoadingHandler = function()
							{
								if(typeof(obj.onLoading) == "function")
								{
									obj.onLoading(obj);
								}
								obj.onLoadingHandlerActive = true;
							}

	obj.onLoadedHandler = function()
							{
								if(typeof(obj.onLoaded) == "function")
								{
									obj.onLoaded(obj);
								}
								obj.onLoadedHandlerActive = true;
							}	

	obj.onInteractiveHandler = function()
								{
									if(typeof(obj.onInteractive) == "function")
									{
										obj.onInteractive(obj);
									}
									obj.onInteractiveHandlerActive = true;
								}

	obj.onCompleteHandler = function()
								{
									obj.responseReceived = true;
									obj.status = obj.xmlHttpRequest.status;
									obj.statusText = obj.xmlHttpRequest.statusText;
									obj.responseText = obj.xmlHttpRequest.responseText;
									obj.responseXML = obj.xmlHttpRequest.responseXML;
									if(typeof(obj.onComplete) == "function")
									{
										obj.onComplete(obj);
									}
									obj.onCompleteHandlerActive = true;
									if(obj.xmlHttpRequest.status == 200 && typeof(obj.onSuccess) == "function")
									{
										obj.onSuccess(obj);
									}
									else if(typeof(obj.onError) == "function")
									{
										obj.onError(obj);
									}
									delete obj.xmlHttpRequest.onreadystatechange;
									obj.xmlHttpRequest = false;
								}	

	obj.onTimeoutHandler = function()
							{
								if(obj && obj.xmlHttpRequest && !obj.onCompleteHandlerActive)
								{
									obj.aborted = true;
									obj.xmlHttpRequest.abort();
									if(typeof(obj.onTimeout) == "function")
									{
										obj.onTimeout(obj);
									}
									delete obj.xmlHttpRequest.onreadystatechange;
									obj.xmlHttpRequest = false;
								}
							}	

	obj.startRequest = function()
					{
						if(obj.xmlHttpRequest)
						{
							var requestContent = null;
							for(var i in obj.parameters)
							{
								if(obj.queryString.length>0)
								{
									obj.queryString += "&";
								}
								obj.queryString += encode(i) + "=" + encode(obj.parameters[i]);
								// encodeURIComponent(i) encodeURIComponent(obj.parameters[i]);
							}
							if(obj.method.toUpperCase() == "GET")
							{
								if(obj.noCacheGetRequest)
								{
									if(obj.queryString.length>0)
									{
										obj.queryString += "&requestRandomId=" + new Date().getTime() + Math.random();
									}
									else
									{
										obj.queryString += "requestRandomId=" + new Date().getTime() + Math.random();
									}
								}
								if(obj.queryString.length>0)
								{
									obj.url += ((obj.url.indexOf("?")>-1)? "&" : "?") + obj.queryString;
								}
							}
							obj.xmlHttpRequest.open(obj.method, obj.url, obj.synchronous, obj.username, obj.password);
							if(obj.method.toUpperCase() == "POST")
							{
								if(typeof(obj.xmlHttpRequest.setRequestHeader) != "undefined")
								{
									obj.xmlHttpRequest.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
								}
								requestContent = obj.queryString;
							}
							if(typeof(obj.xmlHttpRequest.setRequestHeader) != "undefined")
							{
								for(var i in obj.headers)
								{
									obj.xmlHttpRequest.setRequestHeader(i, obj.headers[i]);
								}
							}
							if(obj.timeout>0)
							{
								setTimeout(obj.onTimeoutHandler, obj.timeout);
							}
							obj.xmlHttpRequest.send(requestContent);
						}
					}	

	obj.settingObj = function(objSettings, parametersValue, headersValue)
							{
								for(var i in objSettings)
								{
									obj[i] = objSettings[i];
								}
								for(var i in parametersValue)
								{
									obj.parameters[i] = parametersValue[i];
								}
								for(var i in headersValue)
								{
									obj.headers[i] = headersValue[i];
								}
							}
							
	obj.getAllResponseHeaders = function()
								{
									if(obj.xmlHttpRequest)
									{
										if(obj.responseReceived)
										{
											return obj.xmlHttpRequest.getAllResponseHeaders();
										}
										alert("Impossibile getAllResponseHeaders. Responso non ancora ricevuto");
									}
								}

	obj.getResponseHeader = function(headerName)
							{
								if(obj.xmlHttpRequest)
								{
									if(obj.responseReceived)
									{
										return obj.xmlHttpRequest.getResponseHeader(headerName);
									}
									alert("ImpossibilegetResponseHeader. Responso non ancora ricevuto");
								}
							}	

	return obj;
}

ServerRequest.getXMLHTTPRequestObject = function()
										{
											var obj;
											// Find an xml object
											// IF IE then use the most upto date class ID avalible
											/*@cc_on @*/
											/*@if (@_jscript_version >= 5)
												try
												{
													obj = new ActiveXObject("Msxml2.XMLHTTP")
												}
												catch(e)
												{
													try
													{
														obj = new ActiveXObject("Msxml.XMLHTTP")
													}
													catch(e)
													{
														try
														{
															obj = new ActiveXObject("Microsoft.XMLHTTP")
														}
														catch(E)
														{
															obj = false
														}
													}
												}
											@else
												obj=false
											@end @*/
											// IF not IE then try using Netscape
											if(!obj)
											{
												try
												{
													obj = new XMLHttpRequest();
												}
												catch(e)
												{
													obj = false
												}
											}
											return obj;
										}
										
ServerRequest.sendRequest = function(objSettings, parametersValue, headersValue)
						{
							if(objSettings)
							{
								parametersValue = (parametersValue)?	parametersValue	:	null;
								headersValue = (headersValue)?	headersValue	:	null;
								var newRequest = new ServerRequest();
								newRequest.settingObj(objSettings, parametersValue, headersValue);
								newRequest.startRequest();
							}
						}
						
ServerRequest.formSubmit = function(formObj, objSettings, parametersValue, headersValue)
							{
								objSettings = (objSettings)?	objSettings	:	new Array();
								parametersValue = (parametersValue)?	parametersValue	:	null;
								headersValue = (headersValue)?	headersValue	:	null;
								var formElements = formObj.elements;
								var elementsNumber = formElements.length;
								objSettings["url"] = formObj.action;
								objSettings["method"] = formObj.method;
								var newRequest = new ServerRequest();
								this.addValue = function(elementName, elementValue)
												{
													if(newRequest.queryString.length>0)
													{
														newRequest.queryString += "&";
													}
													newRequest.queryString += encode(elementName) + "=" + encode(elementValue);
												}
								
								for(var i=0; i<elementsNumber; i++)
								{
									if(!formElements[i].disabled)
									{
										switch(formElements[i].type)
										{
											case 'text': case 'password': case 'hidden': case 'textarea':
												this.addValue(formElements[i].name, formElements[i].value);
											break;
											case 'select-one':
												if(formElements[i].selectedIndex >= 0)
												{
													this.addValue(formElements[i].name, formElements[i].options[formElements[i].selectedIndex].value);
												}
											break;
											case 'select-multiple':
												for(var j=0; j<formElements[i].options.length; j++)
												{
													if(formElements[i].options[j].selected)
													{
														this.addValue(formElements[i].name, formElements[i].options[j].value);
													}
												}
											break;
											case 'checkbox': case 'radio':
												if(formElements[i].checked)
												{
													this.addValue(formElements[i].name, formElements[i].value);
												}
											break;
										}
									}
								}
								newRequest.settingObj(objSettings, parametersValue, headersValue);
								newRequest.startRequest();
							}

function encode(s)
{
	return (escape(s).replace("+", "%2B"));
}