function Request(){
	this.abort = false;
	this.type = 'text';
	this.url = '';
	this.params = '';
}

Request.prototype.send = function(){
	try{
		xmlhttp = new XMLHttpRequest();
	}catch(e){
		try{
			xmlhttp = new ActiveXObject('Msxml2.XMLHTTP');
		}catch(e){
			try{
				xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
			}catch(e){
				// alert('error');
			}
		}
	}
	if(xmlhttp.readyState>0){
		this.stop();
	}
	var classRequest = this;
	xmlhttp.onreadystatechange = function(){
		switch(xmlhttp.readyState){
			case 0:
				classRequest.callBack(0,'');
			break;
			case 1:
				classRequest.callBack(1,'');
				if(classRequest.abort){
					classRequest.stop();
				}
			break;
			case 2:
				classRequest.callBack(2,'');
				if(classRequest.abort){
					classRequest.stop();
				}
			break;
			case 3:
				classRequest.callBack(3,'');
				if(classRequest.abort){
					classRequest.stop();
				}
			break;
			case 4:
				classRequest.callBack(4,'');
				if(classRequest.abort){
					classRequest.stop();
				}else{
					if(xmlhttp.status == 200){
						if(classRequest.type.toLowerCase() == 'xml'){
							classRequest.callBack(200,xmlhttp.responseXML);
							classRequest.onLoadComplete(xmlhttp.responseXML);
						}else{
							classRequest.callBack(200,xmlhttp.responseText);
							classRequest.onLoadComplete(xmlhttp.responseText);
						}
					}else{
						classRequest.callBack(xmlhttp.status,'');
						classRequest.onLoadError(xmlhttp.status);
					}
				}
			break;
			default:
				classRequest.callBack(-1,xmlhttp.readyState);
				classRequest.onLoadError(xmlhttp.readyState);
			break;
		}
	}
	if(this.type == 'img'){
		xmlhttp.open('get',this.url+'?'+this.params,true);
		xmlhttp.send(null);
	}else{
		xmlhttp.open('post',this.url,true);
		xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
		xmlhttp.setRequestHeader('Cache-Control','no-store, no-cache, must-revalidate');
		xmlhttp.setRequestHeader('Content-length',this.params.length);
		xmlhttp.setRequestHeader('Connection','close');
		xmlhttp.send(this.params);
	}
};

Request.prototype.callBack = function(){
	// call this function when you want a callback about all process
};

Request.prototype.onLoadComplete = function(){
	// call this function when you want a callback about complete process
};

Request.prototype.onLoadError = function(){
	// call this function when you want a callback about complete process
};

// cancel process (right way)
Request.prototype.cancel = function(){
	this.abort = true;
};

// stop immediatelly
// * don't use it out here because this command return an error if the process is stopped before the step 1 at readyState
Request.prototype.stop = function(){
	this.abort = false;
	xmlhttp.abort();
};

		if(navigator.family == 'ie4' && navigator.version<5){
			document.getElementById = new Function("id", "return document.all[id];");
		}else if (navigator.family == 'nn4'){
			document.getElementById = function(id){
				return getElNN4(document,id);
			};
		}
		
		function getEl(id){
			if(document.getElementById){
				return document.getElementById(id);
			}else if(document.all && !document.getElementById){
				return document.all[id];
			}else if(document.layers){
				return document.layers[id];
			}else{
				return false;
			}
		}

		function getElNN4(id,name){
			var x = id.layers;
			var foundLayer;
			for (var i=0;i<x.length;i++){
				if (x[i].id == name)
				 	foundLayer = x[i];
				else if (x[i].layers.length)
					var tmp = getElNN4(x[i],name);
				if (tmp) foundLayer = tmp;
			}
			return foundLayer;
		}
