function AJAX_Request() {
	this.data = new Array(); 	
}

AJAX_Request.prototype.URLEncode = function(str) {
	if( typeof encodeURIComponent != 'undefined' &&
		typeof encodeURIComponent !=  undefined ) {
	 code = encodeURIComponent(str);
	 code = code.replace( /%20/g , "+" );
	 return code;
	}
	else {
	 return null;
	}
}

AJAX_Request.prototype.SendForm = function(formObjOrName, callBack, mode) {
	this.data = new Array(); 
	
	if (formObjOrName.tagName && formObjOrName.tagName.toLowerCase() == 'form') {
		tf = formObjOrName;
	} else {
		// Если это не обьект формы, то предполагаем, что это имя формы
		tf = document.forms[formObjOrName];
	}
	document.title = 'oz';
	if (!tf) { this.error = "Unable to locate form";	return false; } 
	document.title = 'om';
	for (var i=0; i < tf.length; ++i) {
		var tagName = tf[i].tagName.toLowerCase(); 
		var name = tf[i].getAttribute('name');
		var value = '';
		
		if (tagName == 'input') {
			switch (tf[i].getAttribute('type')) {
				case null:
				case '':
				case 'text':
				case 'hidden':
				case 'password':
					value = tf[i].value;
					break;
				case 'checkbox':
				case 'radio':
					if (tf[i].checked) {
						value = tf[i].getAttribute('value'); 
						if (!value) value = 'on';
					} else {
						continue;
					}
					break;
				default:
					continue;
					break;					
			}
		} else if (tagName == 'textarea') {
			value = tf[i].value;
		} else if (tagName == 'select') {
			if (tf[i].multiple) { 
				opt = tf[i].options;
				for (var j=0; j < opt.length; ++j) {
					if (opt[j].selected) {
						o = new Object(); 
						o.name = name; 
						o.value = opt[j].value;
						this.data.push(o);
					}				
				}
			
				continue; // Мы уже занесли все позиции в массив
			} else {
				value = tf[i].value;
			}
		}
		
		o = new Object(); 
		o.name = name; 
		o.value = value;
		this.data.push(o); 
	}
	document.title = 'on';
	var url = tf.getAttribute('action');		
	requestType = tf.getAttribute('method');
	document.title = 'ok';
	return this.Send(url, requestType, callBack, mode);
}

AJAX_Request.prototype.Set = function(name, value) {		
	var o = new Object();
	o.name = name; 
	o.value = value;
	
	for (var i=0; i < this.data.length; ++i) {
		if (this.data[i].name == 'name') {
			this.data[i] = o; 
			return;
		}
	}
	
	this.data.push(o);		
}


AJAX_Request.prototype.Add = function(name, value) {		
	var o = new Object();
	o.name = name; 
	o.value = value;
	
	this.data.push(o);		
}


AJAX_Request.prototype.Send = function(url, requestType, myCallBack, mode) {
	// Начинаем упаковку в запрос
	var reqStr = '';		
	
	ac = new Date();	
	this.Add('_ac', ac.getTime());
		
	for (i=0; i < this.data.length; ++i) {			
		t = this.data[i];
		if (reqStr != '') reqStr += '&';
		reqStr += this.URLEncode(t.name) + '=' + this.URLEncode(t.value);
	}
	// Отсылаем запрос
	req = false; 
	
	if (typeof window.ActiveXObject != 'undefined') {
		try {
		 	req = new ActiveXObject("Microsoft.XMLHTTP");
		} catch(e) {
			this.error = 'No AJAX object';
		 	return false;
		}
	} else if (typeof XMLHttpRequest != 'undefined') {
		try {
		 	req = new XMLHttpRequest();
		} catch(e) {
			this.error = 'No AJAX object';
			return false;
		}
	}
 	
 	if (!req) {
 		this.error = 'No AJAX object';
 		return false; 
 	}
 		 	
 	if (requestType == null) requestType = 'get';
 	if (!url) url = window.location.href;

 	req.onreadystatechange = function() {
		// only if req shows "loaded"
		if (req.readyState == 4) {

			//get server message
			if( req.statusText == 'undefined' || req.statusText == undefined ) {
				thisStatusText = "HTTP Code " + req.status + "\nNo server message available."
			} else {
				thisStatusText = "HTTP Code " + req.status + "\nServer responded, '" + req.statusText + "'";
			}

			// only if "OK"
			if (myCallBack) {
				if(req.status == 200) {					
					newReq = {};
					newReq.responseText = req.responseText;
					newReq.responseXML = req.responseXML;
				
					while (cookieMonster = newReq.responseText.match(/<META HTTP-EQUIV="SET-COOKIE" CONTENT="([^"]+)">/i)) {
						document.cookie = cookieMonster[1]; 
						newReq.responseText = newReq.responseText.replace(/<META HTTP-EQUIV="SET-COOKIE" CONTENT="([^"]+)">/i, '');
					}				
										
					myCallBack(newReq, true, this, "Operation completed successfully.\n" + thisStatusText );
				} else {
				 	myCallBack(req, false, "Server error.\n" + thisStatusText );
				}
			}
		}
	}
 	
 	//alert('!');
 	
 	
 	
 	if (requestType.toLowerCase() == 'get') {	 		
 		if (url.indexOf('?') == -1) {
 			url += '?' + reqStr;
 		} else {
 			url += '&' + reqStr;
 		}
 
		req.open("GET", url, myCallBack ? true : false);
		req.setRequestHeader("Content-Type" , "application/x-www-form-urlencoded; charset=UTF-8");
		req.send('');
 	} else if( requestType.toLowerCase() == "post" ) {
 	
 		prefix = url.split('.')[0];
 	//	alert(prefix);
 	//	alert(url);
		req.open("POST", url, myCallBack ? true : false);
		req.setRequestHeader("Content-Type" , "application/x-www-form-urlencoded; charset=UTF-8");
		req.send(reqStr);
		

		//$.post(url+'?'+reqStr,{},  myCallBack);
	}
 
 	if (!myCallBack) {
 		this.responseText = req.responseText;
 		this.responseXML = req.responseXML;
 	}
 		 	
	return false;
}
