var net = new 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,notCache) {
      this.hashKey = key; 
      //    ,   request
	  if (!notCache){
		  this.reqHash=hex_md5(url+params)
		  }
      this.unrequestBrowser = false;
      // request - 
      this.req = null;
      this.onload = onload;
      //   ,   
      this.onerror = (onerror) ? onerror : this.defaultError;
      var cachedRes
	   if (!notCache && (cachedRes=getFromCache(this.reqHash))){
		   
		  this.parseResult(cachedRes)
		  return 
	  	}
	  
      this.loadXMLDoc(method, url, params, contentType, headers);
}
//     
net.ContentLoader.prototype = { // Methods
      // loadXMLDoc - ,   request-
      loadXMLDoc : function(method, url, params, contentType, headers) {
            if (!method) method="GET";
            if (!contentType && method=="POST") contentType='application/x-www-form-urlencoded';
            if (window.ActiveXObject) {
                  this.req=new ActiveXObject("Microsoft.XMLHTTP");
            } else if (window.XMLHttpRequest) {
                  this.req=new XMLHttpRequest(); 
            } else {
                  this.unrequestBrowser = true;
                  return;
            }
            if (this.req) {
                  try {
					  	if (method=="GET"){
							url=url+"?"+params+"&dataencoding=windows-1251";
							}
                        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 -     
      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) {
					catchCache(this.reqHash,this.req.responseText)
					this.parseResult(this.req.responseText)
				  }
				else{
                    this.onerror.call(this);
                  }
            }
    	  },
      // defaultError -     
      defaultError : function() {
	      },
		  
	parseResult: function(res){		
		if (!res) {
			return;
			}
		res=res.sliceEmptySides();		
		res.replace(/%%n%%/,"\n");
		
		var resWrapper=getDataWrapper(res ),
			tmplWrap=AJAX_RESULT_FORMATS[resWrapper],
			resData={}
			
		if (resWrapper=="json"){			
			eval('resData='+res+';')
			}
		if (resWrapper=="text"){
			this.onload.call(this,res);
			return
			}
		else if (resWrapper=="js"){
			resData={text:res,status:AJAX_RESULT_STATUSES.ok,type:"js"}
			}
		if (!resData) return
		
		if (resData.status && resData.status==AJAX_RESULT_STATUSES.ok){
				
			if (resData.type=="js"){
				var jsRes=unQuotingString(resData.text);
				jsRes.replace('<script type="text/javascript">','');
				jsRes.replace('</script>','');
				eval(jsRes);return;
				}
			else if (resData.type=="xml"){
				var DP=new DOMParser()
				resData.text=DP.parseFromString(resData.text, "text/xml");
				this.onload.call(this,resData.text);
				}
			else if (resData.type=="json"){
				var resJSONStr=unQuotingString(resData.text),
					resJSON=resData.text;
				this.onload.call(this,resJSON);
				}
			else if (resData.type=="text"){
				
				this.onload.call(this,resData.text);
				}
			else{
				this.onload.call(this,resData.text);
				}
			}
			//status==error
			else{
				alert ("Error: "+resData.text);
				}
		},
	parseJSON: function (tmpl,data){
		var resData={}
		for (var i=0;i<tmpl.length;i++){
			var option=tmpl[i]
			resData[option]=data[i]?data[i]:null
			}
		return resData
		}
		
}

function unQuotingString(str){
	if (!str || typeof str!='string'){
		return str;
		}
	var opener=str.substr(0,1),
		closer=str.substr(str.length-1,1);
	if ((opener=='"' && closer=='"')||(opener=="'" && closer=="'")){
		str=str.substr(1,str.length-2);
		}
	return str;
	}

function getDataWrapper(data){
	var res,
		opener=data.substr(0,1),
		closer=data.substr(data.length-1,1);
	if ((opener=="{" && closer=="}")||(opener=="[" && closer=="]"))
		res="json"
	else 
		res="text"
	return res
	}
var requestsHash = [],
	requestCache={},
	requestCacheHashes=[],
	requestCacheLimit=100

function catchCache(reqHash,reqText){
	if (!reqHash || !reqText) return
	requestCache[reqHash]=reqText
	requestCacheHashes.push(reqHash)
	if (requestCacheHashes.length>requestCacheLimit){
		requestCache[requestCacheHashes.shift()]=null
		}
	return 
	}
function getFromCache(reqHash){
	if (requestCache[reqHash]) return requestCache[reqHash]
	return false
	}

function setAjaxRequest(method, url, params, onload, onerror, contentType, headers,notCache) {
	notCache=true;
	if (!onload) {
	  return false;
	}
	if (!url){
		url=PATH_AJAX;
		}
	if (typeof params=="object"){
	  params=getParamString(params);
	}
	
	requestsHash.push(new net.ContentLoader(requestsHash.length, method, url, params, onload, onerror, contentType, headers,notCache));
	return requestsHash[requestsHash.length - 1].unrequestBrowser;
}


function makeAjax(params,onload,url,method){
	if (!method){
		method='POST'
		}
	if (!url){
		url=PATH_AJAX
		}
	return setAjaxRequest(method,url,params,onload);	
	}

function makeAjaxExt(settings){
	var defaultSettings={
		method:'POST',
		url:PATH_AJAX,
		params:'',
		onload:null,
		staticData:{}
		};
	settings=concatObjects(settings,defaultSettings);
	if (settings.todo && !settings.params.todo){
		settings.params.todo=settings.todo;
		}
	return setAjaxRequest(settings.method,settings.url,settings.params,settings.onload,null,null,null,null,settings.staticData);
	}
	/*Alias for makeAjaxExt*/
	function $A(todo,params,onload){
		params.todo=todo;
		return makeAjaxExt(
			{
				params:params,
				onload:onload		
				}
			);
		}

function ansHandler() {

      alert(this.req.responseText);

      var xml = this.req.responseXML.firstChild;
      if (xml.nodeType != 1) xml = xml.nextSibling; // fix for Opera
      var result = xml.getElementsByTagName("result")[0].firstChild.nodeValue;
      alert("result = " + result);
}

function errorHandler() {
      alert("При обработке запроса произошла ошибка, повторите попытку снова");
}


function getParamString(params)
{
	var paramsStr=''
	if (!params.from) params.from='js'
	for (var paramName in params){
			paramsStr+=paramsStr?'&':''
			paramsStr+=paramName+'='+params[paramName]
		}
		
	return paramsStr
}