var req;
var sendbutton=null;
var onCompleteEval="";
//////
function getHttpRequest(url){
  try{
    var req;
    if(window.XMLHttpRequest) {
      req = new XMLHttpRequest();
      req.open("GET", url, true);
    }else if (window.ActiveXObject) {
      req = new ActiveXObject("Microsoft.XMLHTTP");
      if(req){
        req.open("GET", url, true);
        req.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");            
        req.setRequestHeader("Content-Type","text/xml");
        req.setRequestHeader("Charset","windows-1251");
      }
    }
    req.onreadystatechange = processReqChange;
    return req;
  }catch(e){
    alert("Error getHttpRequest:"+e.message);
  }
}
function postHttpRequest(url){
  try{
    var req;
    if(window.XMLHttpRequest) {
      req = new XMLHttpRequest();
      req.open("POST", url, true);
    }else if (window.ActiveXObject) {
      req = new ActiveXObject("Microsoft.XMLHTTP");
      if(req){
        req.open("POST", url, true);
        req.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");            
        req.setRequestHeader("Content-Type","text/xml");
        req.setRequestHeader("Charset","windows-1251");
      }
    }
    req.onreadystatechange = processReqChange;
    return req;
  }catch(e){
    alert("Error postHttpRequest:"+e.message);
  }
}

function aGet(url,onComplete){
  try{
    //alert("Request:"+url);
    url=url+'&hash'+Math.random();
    req=getHttpRequest(url);
    req.send(null);
    if(onComplete){onCompleteEval=onComplete;}
  }catch(e){
    alert("Error aGet:"+e.message);
  }
}
function aPost(url,data){
  try{
    data=data+'&hash'+Math.random();
    req=postHttpRequest(url);
    req.send(data);
    if(onComplete){onCompleteEval=onComplete;}
  }catch(e){
    alert("Error aPost:"+e.message);
  }
}

function loadXMLDoc(url){
  try{
    url=url+'&hash'+Math.random();
    req=getHttpRequest(url);
    req.url=url;
    req.onreadystatechange = processReqChange;
    req.send(null);
  }catch(e){
    alert(e.message+'\n in loadXMLDoc');
  }
}


function viewObject(name) {
	var obj = eval(name), i;

	if(!obj) 	{
		alert("\""+name+"\" ia not an object");
		return;
	}

	var w_Test = open("","Test","width=600,height=500,scrollbars=1");

	if(!w_Test) {
		alert("Cannot open window for "+name);
		return;
	}

	w_Test.document.open();
	for(i in obj) w_Test.document.write(name+"."+i+"="+obj[i]+"<br>");

	w_Test.document.close();
}


//////
function processReqChange(){

	try{
    if(req.readyState == 4) {
        // only if "OK"
      if(req.status == 200||req.status == 302||req.status == 301){
        //alert("Response:"+req.responseText);
        eval(onCompleteEval+"('"+escape(req.responseText)+"',req);");
        if(sendbutton){
          sendbutton.disabled=false;
          sendbutton=null;
        }
      }else{
        alert("Не удалось получить данные:\n" + 'Status text:'+req.statusText+'\n'+'Status code:'+req.status);
      }
    }
  }catch(e){
    alert(e.message+'\n in processReqChange');
  }
}

function stat(n){
  try{
    switch (n) {
      case 0: return "не инициализирован"; break;        
      case 1: return "загрузка...";        break;      
      case 2: return "загружено";          break;      
      case 3: return "в процессе...";      break;        
      case 4: return "готово";             break;      
      default:return "неизвестное состояние";  
    }  
  }catch(e){
    alert(e.message+'\n in stat');
  }
}

function ajax_response(){
  try{
  	this.status=false;
	  this.message=false;
	  this.link=false;
	}catch(e){
    alert('Error in ajax_response:'+e.message);
	}
  return this;
}

function parse_ajax_response(xml,response){
  try{
	  var nodes=false;	  
	  var subnodes=false;
		if(typeof(response)=='undefined'){
		  if(!xml||!xml.firstChild){return;}
		  response=new ajax_response();
		  nodes=xml.firstChild.childNodes;
		}else{
	    nodes=xml;
		  subnodes=true;
		}
    for(var i=0;i<nodes.length;i++){
      if(subnodes){
        try{
          var res=new Array();
          var values=nodes[i].childNodes;
					//alert('nodes[i].tagName:'+nodes[i].tagName);
					//res[nodes[i].tagName]=nodes[i].firstChild.nodeValue;
					response[nodes[i].tagName]=nodes[i].firstChild.nodeValue;
			    for(var j=0;j<values.length;j++){
		        var value_name=values[j];
		        if(value_name){
			        var value_data=value_name.firstChild;
			        if(value_data){
								//alert('value_name.tagName:'+value_name.tagName);
						    //res[value_name.tagName]=value_data.nodeValue;
						  }
					  }

			    }
          //response[response.length]=res;
        }catch(e){
				  alert('Error in parse_ajax_response(subnodes):'+e.message);
				  return false;
        }
      }else{
        try{
  	      var child=nodes[i];
  	      var text=child.firstChild;
  	      if(child.firstChild.childNodes.length==0){
						//alert(child.tagName);
  		      eval('response.'+child.tagName+'=\''+text.nodeValue+'\';');
  			  }else{
						//alert(child.tagName);
  		      eval('response.'+child.tagName+'=parse_ajax_response(child.childNodes,new Array());');
  		    }
        }catch(e){
				  alert('Error in parse_ajax_response(main parse):'+e.message);
				  return false;
        }
		  }
    }
	  return response;
  }catch(e){
    alert('Error in parse_ajax_response:'+e.message);
    return false;
  }
}

function ajax_xml(param, type, funcname){
  try{
		var now = new Date();
    var url = "/ajax.php?param="+param+"&q="+type+"&version=xml";
		//open(url,type+' '+funcname);
    aGet(url,funcname);
  }catch(e){
    alert('Error in ajax_requested:'+e.message);
  }
}

///  обращение к ajax.php с ожидалкой
var ajax_request=false;
var ajax_callback=false;
var ajax_repeat=false;
var ajax_maxcount=30;
var ajax_count=0;

function ajax(type,param,funcname,arepeat,maxcount){
  try{
		var now = new Date();
	  var url = "/ajax.php?param="+param+"&q="+type+"&version=xml";
	  ajax_request=url;
	  ajax_callback=funcname;
	  ajax_count=0;
	  /// Выставляем интервал повтора
	  ajax_repeat=(typeof(arepeat)=='undefined')?1000:arepeat;
	  ajax_maxcount=(typeof(maxcount)=='undefined')?30:maxcount;
	  aGet(url,'ajax_waiter');
  }catch(e){
    alert('Error in ajax_requested:'+e.message);
  }
}

/// Ожидалка непустого ответа
function ajax_waiter(contentXML,xml){
  try{
	  response=parse_ajax_response(xml.responseXML);
	  if(response){
	   	ajax_callback(response);
	   	ajax_request=false;
	  }else{
	    /// Не пришло
	    if(ajax_count<ajax_maxcount){
	      /// Повторяем
			  setTimeout("aGet(ajax_request,'ajax_waiter');",ajax_repeat);
			}else{
			  /// возвращаем таймаут
		   	ajax_callback(ajax_timeout());
			}
	  }
	  /// увеличиваем число итераций.
   	ajax_count++;
  }catch(e){
    alert('Error in ajax_waiter:'+e.message);
  }
}

/// Генерит респонс с таймаутным статусом
function ajax_timeout(){
	response=new ajax_response();
	response.status='TIMEOUT';
	return response;
}

// Old style AJAX requests
var ldr=null;

function selector(){
	try{
		var A=null;
		try{A=new ActiveXObject("Msxml2.XMLHTTP")}
		catch(e){try{A=new ActiveXObject("Microsoft.XMLHTTP")}
		catch(oc){A=null}}
		if(!A&&typeof XMLHttpRequest!="undefined") {A=new XMLHttpRequest()}
		return A
	}catch(e){
	  alert('Error in selector:'+e.message);
	}
}


function chan(iid,type){
  try{
		if(ldr&&ldr.readyState!=0) { ldr.abort() }
		ldr=selector();
		if(ldr){
			name.length = 0;
			var now = new Date();
			if(type) ldr.open("GET","/ajax.php?param="+iid+"&q="+type+"&t="+now.getSeconds(),true);
			else ldr.open("GET","/ajax.php?param="+iid+"&q=auth&t="+now.getSeconds(),true);
			ldr.onreadystatechange=function(){
				if(ldr.readyState==4 && ldr.responseText){
					eval(ldr.responseText);
				}
			}
			ldr.send(null)
		}
	}catch(e){
	  alert('Error in chan:'+e.message);
	}
}
