var __ajax={
 "callback_function": null, // функция смены состояния 
 "loading_id": "loading_div_id", // id div'а, который демонстрирует gif загрузки
 "before_function": null,
 "after_function": null, // функции JavaScript, которые выполняются до и после запуска AJaX скрипта
 "onreadystatechange": __ajax_onreadystatechange
};

// var __ajax_callback_function=null; // функция смены состояния
// var __ajax_loading_gif_id=true; // нужно ли заботиться о loading.gif

function createXMLHTTPRequest()
{
 try
 {
  request=new XMLHttpRequest();
 }
 catch(trymicrosoft)
 {
  try
  {
   request=new ActiveXObject("Msxml2.XMLHTTP");
  }
  catch(othermicrosoft)
  {
   try
   {
    request=new ActiveXObject("Microsoft.XMLHTTP");
   }
   catch(failed)
   {
    request=false;
   }
  }
 }
 
 if(!request)
  alert("Error initializing XMLHttpRequest!");
 
 return request;
}


///////////////////////////////////////////////////////////////////
function ajax_request(script, params, callback, method, async, req)
{
 // осуществляет AJaX-запрос
 // script - файл скрипта, который нужно вызвать
 // params - строка параметров
 // callback - функция обработки состояний запроса
 // method - POST или GET
 // async - асинхронный или синхронный запрос (опционально)
 // req - объект XMLHTTP (опционально, если его нет, то идет попытка его создать)
 request=req ? req : createXMLHTTPRequest();
 
 if(!request) return;
 if(!script || script=="") return;
 
 if(!callback) return;
 request.onreadystatechange=__ajax.onreadystatechange;
 if(callback) __ajax.callback_function=callback;
 
 if(!method) method="GET";
 if(method!="POST" && method!="GET") method="GET";
 
 if(!async) async=true;
 if(async!=false && async!= true) async=true;
 
 if(__ajax.before_function) __ajax.before_function();
 
 if(__ajax.loading_id)
  document.getElementById(__ajax.loading_id).style.display="block"; // loading.gif
 
 // Вызов запроса
 if(method=="GET")
 {
  if(params && params!="") script+="?"+params;
  request.open(method, script, async);
  request.send(null);
 }
 else // POST
 {
  request.open(method, script, async);
//  if(params && params!="")
  {
   request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
   request.send(params);
  }
 }
}


function __ajax_onreadystatechange()
{
// alert(request.status);
 if(request.readyState==4 && request.status==200)
 {
  if(__ajax.loading_id) document.getElementById(__ajax.loading_id).style.display="none";
  if(__ajax.after_function) __ajax.after_function();
  if(__ajax.callback_function) __ajax.callback_function();
  __ajax.callback_function=null;
 }
}
