var net = new Object(); // Namespacing object
net.READY_STATE_UNINITIALIZED = 0;
net.READY_STATE_LOADING = 1;
net.READY_STATE_LOADED = 2;
net.READY_STATE_INTERACTIVE = 3;
net.READY_STATE_COMPLETE = 4;
net.ContentLoader = function(key, method, url, params, onload, onerror, contentType, headers) { // Constructor
	this.hashKey = key;
	this.unrequestBrowser = false;
	this.req = null;
	this.onload = onload;
	this.onerror = (onerror) ? onerror : this.defaultError;
	this.loadXMLDoc(method, url, params, contentType, headers);
}
net.ContentLoader.prototype = { // Methods
	loadXMLDoc : function(method, url, params, contentType, headers) {
		if (!method) method="GET";
		if (!contentType && method=="POST") contentType='application/x-www-form-urlencoded';
		if (window.XMLHttpRequest) {
			this.req=new XMLHttpRequest(); 
		} else if (window.ActiveXObject){
			this.req=new ActiveXObject("Microsoft.XMLHTTP");
		} else {
			this.unrequestBrowser = true;
			return;
		}
		if (this.req) {
			try {
				this.req.open(method,url,true);
				if (contentType){
					this.req.setRequestHeader('Content-Type', contentType);
				}
				if (headers) {
					for (var h in headers) {
						this.req.setRequestHeader(h,headers[h]);
					}
				}
				var loader=this;
				this.req.onreadystatechange=function() {
					loader.onReadyState.call(loader);
				}
				this.req.send(params);
			} catch (err){
				this.onerror.call(this);
			}
		}
	},
	onReadyState : function() {
		var req=this.req;
		var ready=req.readyState;
		if (ready==net.READY_STATE_COMPLETE) {
			var httpStatus=req.status;
			if (httpStatus==200 || httpStatus==0) {
				this.onload.call(this);
			} else {
				this.onerror.call(this);
			}
		}
	},
	defaultError : function() {
		alert("error fetching data!"+"\n\nreadyState:"+this.req.readyState +"\nstatus: "+this.req.status+"\nheaders: "+this.req.getAllResponseHeaders());
	}
}
// Multy requests
var requestsHash = [];
function setAjaxRequest(method, url, params, onload, onerror, contentType, headers, _link) {
	// Check of necessary parameters
	if (!(url && params)) {
		alert("Necessary parameters are not specified");
		return;
	}
	requestsHash[requestsHash.length] = new net.ContentLoader(requestsHash.length, method, url, params, onload, onerror, contentType, headers);
	requestsHash[requestsHash.length] = (_link) ? _link : 0;
	return requestsHash[requestsHash.length - 2].unrequestBrowser;
}

function urlEncode(str) {
      if (!str || typeof(str) == "undefined") return;
      var utf8Array = {};
      var i = j = j2 = 0;
      for (i = 0; i <= 255; i++) {
            j = parseInt(i/16); var j2 = parseInt(i%16);
            utf8Array[String.fromCharCode(i)] = ('%' + j.toString(16) + j2.toString(16)).toUpperCase();
      }
      var rusAdditional = {
            '_' : '%5F', 'À' : '%C0', 'Á' : '%C1', 'Â' : '%C2', 'Ã' : '%C3', 'Ä' : '%C4', 'Å' : '%C5',
            'Æ' : '%C6', 'Ç' : '%C7', 'È' : '%C8', 'É' : '%C9', 'Ê' : '%CA', 'Ë' : '%CB', 'Ì' : '%CC',
            'Í' : '%CD', 'Î' : '%CE', 'Ï' : '%CF', 'Ð' : '%D0', 'Ñ' : '%D1', 'Ò' : '%D2', 'Ó' : '%D3',
            'Ô' : '%D4', 'Õ' : '%D5', 'Ö' : '%D6', '×' : '%D7', 'Ø' : '%D8', 'Ù' : '%D9', 'Ú' : '%DA',
            'Û' : '%DB', 'Ü' : '%DC', 'Ý' : '%DD', 'Þ' : '%DE', 'ß' : '%DF', 'à' : '%E0', 'á' : '%E1',
            'â' : '%E2', 'ã' : '%E3', 'ä' : '%E4', 'å' : '%E5', 'æ' : '%E6', 'ç' : '%E7', 'è' : '%E8',
            'é' : '%E9', 'ê' : '%EA', 'ë' : '%EB', 'ì' : '%EC', 'í' : '%ED', 'î' : '%EE', 'ï' : '%EF',
            'ð' : '%F0', 'ñ' : '%F1', 'ò' : '%F2', 'ó' : '%F3', 'ô' : '%F4', 'õ' : '%F5', 'ö' : '%F6',
            '÷' : '%F7', 'ø' : '%F8', 'ù' : '%F9', 'ú' : '%FA', 'û' : '%FB', 'ü' : '%FC', 'ý' : '%FD',
            'þ' : '%FE', 'ÿ' : '%FF', '¸' : '%B8', '¨' : '%A8'
      }
      for (i in rusAdditional) utf8Array[i] = rusAdditional[i];
      var res = "";
      for(i = 0; i < str.length; i++) {
            var simbol = str.substr(i,1);
            res += typeof utf8Array[simbol] != "undefined" ? utf8Array[simbol] : simbol;
      }
      res = res.replace(/\s/g, "+");
      return res;
}
