var _stat_loads = 0;
var _stat_load_req = 0;
var _stat_loaded_bytes = 0;

var _q1 = new Array();
var _callbacks1 = new Array();
var _loadReq1;
var _load_id1;
var	_load_bClear1;
var _load_elem1;
var _stat_rate1 = 0;
var time_of_start1;
var time_of_stop1;
var _loaded_text1;
// --- 2 ----
var _q2 = new Array();
var _callbacks2 = new Array();
var _loadReq2;
var _load_id2;
var	_load_bClear2;
var _load_elem2;
var _stat_rate2 = 0;
var time_of_start2;
var time_of_stop2;
var _loaded_text2;
// --- 3 ----
var _q3 = new Array();
var _loadReq3;
var _load_id3;
var	_load_bClear3;
var _load_elem3;
var _stat_rate3 = 0;
var time_of_start3;
var time_of_stop3;
var _loaded_text3;
/// -----------------------------
var _topmostwin = window;
function LoadRequest(url,id,type,postData,oElem,bClear,loadedCallback){
		if(url[0]=='/'){
			url = window.location.protocol + '//' + window.location.host + url;
		}
		var pair = new Array();
		pair[0] = url;
		pair[1] = id ? id : 'ch_tmp';
		pair[2] = type;
		pair[3] = postData;
		pair[4] = oElem;
		pair[5] = bClear;
		_q1[_q1.length] = pair;
		_callbacks1[_callbacks1.length] = loadedCallback;
	if(_q1.length == 1){
		// make real request 
		MakeLoadRequest(pair);		
	}
}

function LoadRequest2(url,id,type,postData,oElem,bClear,loadedCallback){
		if(url[0]=='/'){
			url = window.location.protocol + '//' + window.location.host + url;
			//alert(url);
		}
		var pair = new Array();
		pair[0] = url;
		pair[1] = id ? id : 'ch_tmp';
		pair[2] = type;
		pair[3] = postData;
		pair[4] = oElem;
		pair[5] = bClear;
		_q2[_q2.length] = pair;
		_callbacks2[_callbacks2.length] = loadedCallback;
		//alert('callback=' + loadedCallback + ' id= ' + id);
	if(_q2.length == 1){
		// make real request 
		MakeLoadRequest2(pair);		
	}
}

function LoadRequest3(url,id,type,postData,oElem,bClear,loadedCallback){
		if(url[0]=='/'){
			url = window.location.protocol + '//' + window.location.host + url;
//			alert(url);
		}
		var pair = new Array();
		pair[0] = url;
		pair[1] = id ? id : 'ch_tmp';
		pair[2] = type;
		pair[3] = postData;
		pair[4] = oElem;
		pair[5] = bClear;
		_q3[_q3.length] = pair;
		//alert('callback=' + loadedCallback + ' id= ' + id);
	if(_q3.length == 1){
		// make real request 
		MakeLoadRequest3(pair);		
	}
}

function MakeLoadRequest(pair){
	// pair : url,id,type,postData,oElem,bClear
	//		   0   1  2    3       4     5 
	/*
		uses global:
		_loadReg
		_load_id1
		_load_bClear1
		_load_elem1
	
	*/
		_load_id1 = pair[1];
		_load_bClear1 = pair[5];
		if(pair[4])
			_load_elem1 = pair[4];
		else 
			_load_elem1 = null;
		if (window.XMLHttpRequest) { // native XMLHttpRequest
			_loadReq1 = new XMLHttpRequest();
		} else if (window.ActiveXObject) { // IE/Windows
			_loadReq1 = new ActiveXObject("Microsoft.XMLHTTP");
		}
		if (_loadReq1) {
        	_loadReq1.onreadystatechange = OnLoadedState;
        	_loadReq1.open(pair[2]? pair[2] : "GET", pair[0], true);
 			if(pair[2] == 'POST'){     
				_loadReq1.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			//	_loadReq1.setRequestHeader('Referer', window.location.protocol + '//' + window.location.host + '/'); 
			}
			var time = new Date();
			time_of_start1 = time.getTime();
        	_loadReq1.send(pair[3]);
		}
	_stat_load_req++;_debug_update();
}

function MakeLoadRequest2(pair){
	// pair : url,id,type,postData,oElem,bClear
	//		   0   1  2    3       4     5 
	/*
		uses global:
		_loadReg
		_load_id1
		_load_bClear1
		_load_elem1
	
	*/
		_load_id2 = pair[1];
		_load_bClear2 = pair[5];
		if(pair[4])
			_load_elem2 = pair[4];
		else 
			_load_elem2 = null;
		if (window.XMLHttpRequest) { // native XMLHttpRequest
			_loadReq2 = new XMLHttpRequest();
		} else if (window.ActiveXObject) { // IE/Windows
			_loadReq2 = new ActiveXObject("Microsoft.XMLHTTP");
		}
		if (_loadReq2) {
        	_loadReq2.onreadystatechange = OnLoadedState2;
        	_loadReq2.open(pair[2]? pair[2] : "GET", pair[0], true);
 			if(pair[2] == 'POST'){     
				_loadReq2.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			//	_loadReq1.setRequestHeader('Referer', window.location.protocol + '//' + window.location.host + '/'); 
			}
			var time = new Date();
			time_of_start2 = time.getTime();
        	_loadReq2.send(pair[3]);
		}
	_stat_load_req++;_debug_update();
}

function MakeLoadRequest3(pair){
	// pair : url,id,type,postData,oElem,bClear
	//		   0   1  2    3       4     5 
	/*
		uses global:
		_loadReg
		_load_id1
		_load_bClear1
		_load_elem1
	
	*/
		_load_id3 = pair[1];
		_load_bClear3 = pair[5];
	
		if(pair[4])
			_load_elem3 = pair[4];
		else 
			_load_elem3 = null;

		if (window.XMLHttpRequest) { // native XMLHttpRequest
			_loadReq3 = new XMLHttpRequest();
		} else if (window.ActiveXObject) { // IE/Windows
			_loadReq3 = new ActiveXObject("Microsoft.XMLHTTP");
		}
		if (_loadReq3) {
        	_loadReq3.onreadystatechange = OnLoadedState3;
        	_loadReq3.open(pair[2]? pair[2] : "GET", pair[0], true);
 			if(pair[2] == 'POST'){     
				_loadReq3.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			}
			var time = new Date();
			time_of_start3 = time.getTime();
        	_loadReq3.send(pair[3]);
		}
	_stat_load_req++;_debug_update();
}

function OnLoadedState(){
    if (4 == _loadReq1.readyState) {
        // only if "OK"
         if (_loadReq1.status == 200) {
			_loaded_text1 = _loadReq1.responseText; 
			var time = new Date();
			time_of_stop1 = time.getTime();
			// update rate  
			if (time_of_stop1 != time_of_start1) {
				d_period 	= (time_of_stop1 - time_of_start1)/1000;
				datasize	= _loadReq1.responseText.length;
				var rate 	= Math.round(datasize / d_period);
				_stat_rate1 	= _stat_rate1 !=0 ? (_stat_rate1 + rate) / 2 : rate;
			}
         	// shift queue
			_q1.shift();
			var callbackName = _callbacks1[0];
			if(callbackName && callbackName.length > 0 ){
				eval(callbackName);
				_callbacks1.shift();
			}
			var oSpan = document.createElement('span');
			//oSpan.style.display = 'inline-block';
            AppendLoaded(oSpan,_load_id1,_loadReq1.responseText);
            // 
            _stat_loaded_bytes += _loadReq1.responseText.length;
			_stat_loads++;_debug_update();
            if(_q1.length > 0){
            	var pair = _q1[0];
            	MakeLoadRequest(pair);
            }
        } else {
            alert("Error loading page:\n" + _loadReq1.statusText + "\n url: \n" + _q1[0][0]);
        	_q1.shift();
        }
    }
}

function OnLoadedState2(){
    if (4 == _loadReq2.readyState) {
        // only if "OK"
         if (_loadReq2.status == 200) {
			_loaded_text2 = _loadReq2.responseText; 
			var time = new Date();
			time_of_stop2 = time.getTime();
			// update rate  
			if (time_of_stop2 != time_of_start2) {
				d_period 	= (time_of_stop2 - time_of_start2)/1000;
				datasize	= _loadReq2.responseText.length;
				var rate 	= Math.round(datasize / d_period);
				_stat_rate2 	= _stat_rate2 !=0 ? (_stat_rate2 + rate) / 2 : rate;
			}
         	// shift queue
			_q2.shift();
			OnPrivatReloaded();
			var callbackName = _callbacks2[0];
			if(callbackName && callbackName.length > 0 ){
				eval(callbackName);
				_callbacks2.shift();
			}
			var oSpan = document.createElement('span');
			//oSpan.style.display = 'inline-block';
            AppendLoaded(oSpan,_load_id2,_loadReq2.responseText);
            // 
            _stat_loaded_bytes += _loadReq2.responseText.length;
			_stat_loads++;_debug_update();
			
            if(_q2.length > 0){
            	var pair = _q2[0];
            	MakeLoadRequest2(pair);
            }
            
        } else {
            alert("Error loading page:\n" + _loadReq2.statusText + "\n url: \n" + _q2[0][0]);
        	_q2.shift();
        }
    }
}

function OnLoadedState3(){
    if (4 == _loadReq3.readyState) {
        // only if "OK"
         if (_loadReq3.status == 200) {
			_loaded_text3 = _loadReq3.responseText; 
			
			var time = new Date();
			time_of_stop3 = time.getTime();
			// update rate  
			if (time_of_stop3 != time_of_start3) {
				d_period 	= (time_of_stop2 - time_of_start2)/1000;
				datasize	= _loadReq3.responseText.length;
				var rate 	= Math.round(datasize / d_period);
				_stat_rate3 	= _stat_rate3 !=0 ? (_stat_rate3 + rate) / 2 : rate;
			}
         	// shift queue
			_q3.shift();
			/// 
			OnChatReloaded();
			
			var oSpan = document.createElement('span');
			//oSpan.style.display = 'inline-block';
            AppendLoaded(oSpan,_load_id3,_loadReq3.responseText);
            // 
            _stat_loaded_bytes += _loadReq3.responseText.length;
			_stat_loads++;_debug_update();
            if(_q3.length > 0){
            	var pair = _q3[0];
            	MakeLoadRequest3(pair);
            }
        } else {
            alert("Error loading page:\n" + _loadReq3.statusText + "\n url: \n" + _q2[0][0]);
        	_q3.shift();
        }
    }
}


function LoadContNode(Tipe,url,id,type,postData,oElem,bClear,callbackName){
	if(Tipe==1){
		LoadRequest(url,id,type,postData,oElem,bClear,callbackName);
	}else if(Tipe==2){
		LoadRequest2(url,id,type,postData,oElem,bClear,callbackName);
	}else if(Tipe==3){
		LoadRequest3(url,id,type,postData,oElem,bClear,callbackName);
	}
} 

function AppendLoaded(oElem,parentID,innerHTMLText,bClear){
	oParent = GetById(parentID);
	if(!oParent)
		return;
	if(oElem){
		oElem.innerHTML = innerHTMLText;
		if(true == bClear) {
			//oParent.innerHTML = '';
		}	
		ClearElement(oParent);
		oParent.appendChild(oElem);
	}else{
		//alert('innerHtml');
		oParent.innerHTML = innerHTMLText;
	}
}
xbrowser = new function() {
	this.isIE = (navigator.appName.indexOf('Microsoft') >= 0);
	this.isN = (navigator.appName.indexOf('Netscape') >= 0);
	this.isO = (navigator.appName.indexOf('Opera') >= 0);
	var i = -1;
	if (this.isIE) {
        i = navigator.appVersion.indexOf('MSIE ');
        i = (i >= 0) ? (i + 5) : 0;
	}
	else if (this.isN || this.isO)
		i = 0;
	this.version = (i >= 0) ? parseFloat(navigator.appVersion.substring(i)) : 0;
	//this.supported = ((this.isIE && this.version >= 4) || (this.isN && this.version >= 4) || (this.isO && this.version >= 6));
	this.caps = {
		cssPositionFixed: (this.isN || this.isO),  // IE5 doesn't support style="position:fixed"
		attrAccessMode: ((this.isIE && this.version < 6) ? 'ie' : 'dom')  // used by xattr
	};
};

xattr = function(elem, name) {
	if (elem) {
		switch(xbrowser.caps.attrAccessMode) {
			case 'ie': {
				var a = elem[name];
				return (typeof(a) == 'string') ? a : null;
			}
			case 'dom': {
				if (elem.attributes) {
					var a = elem.attributes.getNamedItem(name);
					if (a) return a.nodeValue;
				}
			}
		}
	}
	return null;
};

xattr2 = function(elem, name) {
	if (elem) {
		switch(xbrowser.caps.attrAccessMode) {
			case 'ie': {
				var a = elem[name];
				return (typeof(a) == 'string') ? a : null;
			}
			case 'dom': {
				if (elem.attributes) {
					var a = elem.attributes.getNamedItem(name);
					if (a) return a;
				}
			}
		}
	}
	return null;
};


function PrepareFormData(filterText){
	var oInputs = document.getElementsByTagName('input');
	var oTextareas = document.getElementsByTagName('textarea');
	var oButtons = document.getElementsByTagName('button');
	var oSelects = document.getElementsByTagName('select');
	var i;
	var theText =''
	theText += MakeURLFromCtrlCol(oInputs,filterText);
	theText += MakeURLFromCtrlCol(oTextareas,filterText);
	theText += MakeURLFromCtrlCol(oButtons,filterText);
	theText += MakeURLFromCtrlCol(oSelects,filterText);
//	alert(theText);
	return theText;
}

function MakeURLFromCtrlCol(col,filterText){
	var i;
	var theText =''
	for(i=0;i<col.length;i++){
		if(col[i].value.length > 0){
			// apply the filter
			if(   (col[i].name.substr(0,filterText.length)== filterText) ||
				  	('command' == col[i].name)
			   )	  	 
			   if(col[i].type == 'checkbox'){
			   	if(col[i].checked)
				   var theValue = 'on';
				 else continue;  
			   }else{
				   var theValue = col[i].value; 
			   }
				theText += '&'+col[i].name+'='+escape(theValue);
		}		
	}

	return theText;
}

function LoadElement(Tipe,id,pageURL,bPost,filterText,oNewElem,bClear,callbackName){
	var oElem = GetById(id);
	if(!oElem)
		return;
	var formData,strType;
	if(bPost){
		formData = PrepareFormData(filterText);
		strType = 'POST'; 
	}else{
		strType = 'GET';
		formData = null;
	}	
	LoadContNode(Tipe,pageURL,id,strType,formData,oNewElem,bClear,callbackName);
}

/// ---------------------------------------


function ClearElement(o){
	var tn = o.tagName.toLowerCase();
	if(tn == 'table'){
		ClearTable(o);
	}else if(tn == 'tr'){
		ClearTR(o);
	}else{
		o.innerHTML = '';
	}
}

function ClearTR(oTr){
	if(!oTr)
		return;
	if(!oTr.cells)
		return;
	while(oTr.cells.length)
		oTr.deleteCell(0);
}

function ClearTable(oTable){
	if(!oTable)
		return;
	if(oTable.rows)
		while(oTable.rows.length)
			oTable.deleteRow(0);
	if(oTable.childNodes)
		while(oTable.childNodes.length)
			oTable.removeChild(oTable.childNodes[0]);
}
function _debug_update(){
	var oLoads = GetById('_debug_loads');
	if(oLoads){
		oLoads.innerHTML = _stat_loads;
	}
	var oLoadReq = GetById('_debug_load_req');
	if(oLoadReq){
		oLoadReq.innerHTML = _stat_load_req;
	}
	var o = GetById('_debug_loaded_bytes');
	if(o){
		o.innerHTML = _stat_loaded_bytes;
	}
	var o = GetById('_debug_rate');
	if(o){
		o.innerHTML = Math.round(_stat_rate1*10/1024)/10;
	}
}


//--------------------------------------------------------------------------------------------------------------------------
function GetById(id, doc) {
	if(!doc) doc=document;
	if(doc.getElementById) return doc.getElementById(id);
	else if(doc.all) return doc.all[id];
	return null;
}
//--------------------------------------------------------------------------------------------------------------------------
