//Ajax result formats:
var AJAX_RESULT_FORMATS={
		json:['status','type','text'],
		js:['text']
		},
	AJAX_RESULT_STATUSES={
		fail:0,
		ok:1
		}

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,staticData,blockingScreen) {
      this.hashKey = key; 
      //    ,   request
	  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 ((cachedRes=getFromCache(this.reqHash)) && !notCache){
		  this.parseResult(cachedRes)
		  return;
	  	}
		
	  this.staticData=staticData;
	  this.blockingScreen=blockingScreen;
      this.loadXMLDoc(method, url, params, contentType, headers);
	}
//     
net.ContentLoader.prototype = {
      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) {
				  if (this.blockingScreen){
					showAjaxProgress();
				  	}
                  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);
					if (this.blockingScreen){
						stopShowAjaxProgress();
						}
					this.parseResult(this.req.responseText)
				  }
				else{
                    this.onerror.call(this);
                  }
            }
    	  },
    // defaultError -     
    defaultError : function() {
	      },
		  
	parseResult: function(res){		
		if (!res) {
			return;
			}
		
		res.replace(/%%n%%/,"\n");
		
		var resWrapper=getDataWrapper(res ),
			tmplWrap=AJAX_RESULT_FORMATS[resWrapper],
			resData={};
			
		if (resWrapper=="json"){
			//eval('resData='+res+';');
			resData=eval('(' + 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>','');
				//alert (jsRes); 
				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 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){
	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);
	//FIXME: write correct function
	
	//alert("data substr-1 is "+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, staticData,blockingScreen) {
      if (!url || !onload) {
		  return false;
	  	}
	  if (typeof params=="object"){
		  params=getParamString(params);
	  	}
      requestsHash.push(new net.ContentLoader(requestsHash.length, method, url, params, onload, onerror, contentType, headers,notCache,staticData,blockingScreen));
      return requestsHash[requestsHash.length - 1].unrequestBrowser;
}



function makeAjax(params,onload,url,method,staticData){
	if (!method){
		method='POST';
		}
	if (!url){
		url=PATH_AJAX;
		}
	return setAjaxRequest(method,url,params,onload,null,null,null,null,staticData);	
	}
	
function makeAjaxExt(settings){
	var defaultSettings={
		method:'POST',
		url:PATH_AJAX,
		params:{resultformat:'json'},
		onload:null,
		staticData:{},
		bs:false,
		notCache:true
		};
	
	settings=rConcatObjects(settings,defaultSettings);
	return setAjaxRequest(settings.method,settings.url,settings.params,settings.onload,null,null,null,settings.notCache,settings.staticData,settings.bs);
	}



/* function doit() {
      var method = "GET";
      var url = "bg_test.php";
      var params = false; // Без параметров
      var onload = ansHandler;
      var onerror = errorHandler;
      var contentType = headers = false; // Без заголовков
      return setAjaxRequest(method, url, params, onload, onerror, contentType, headers);
} */

function getParamString(params)
{
	var paramsStr=''
	if (!params.from) params.from='js'
	for (var paramName in params){
			if (params[paramName]==undefined){
				continue;
				}
			paramsStr+=paramsStr?'&':''
			paramsStr+=paramName+'='+params[paramName]
		}
		
	return paramsStr
}
