function obAJAX(){
var AJAX=this;

//Создадим переменную AJAX которая будет основным интерфейсом AJAX технологии
//AJAX = new Object();

//Создадим два события, для загрузки и для ошибки
AJAX.onload  = null;
AJAX.onerror = null;

//Так же нам понадобятся два масива для хранения GET и POST параметров
AJAX.GET  = new Array();
AJAX.POST = new Array();

//Создадим две переменные, которые будут хранить результат
AJAX.text = null;
AJAX.xml  = null;

//Эта переменная при ошибке будет хранить описание ошибки
AJAX.errtext = null;

//Переменная для хранения таймера соеденения
AJAX.TIMEOUT = null;

//Инициализируем технологию AJAX
if(window.XMLHttpRequest) {
  AJAX.HTTP = new XMLHttpRequest();
} else if(window.ActiveXObject) {
  AJAX.HTTP = new ActiveXObject("Microsoft.XMLHTTP");
}

//Создадим функцию для обработки состояния соеденения
function onReadyStateChange() {
  if(AJAX.HTTP.readyState == 4) {
    clearTimeout(AJAX.TIMEOUT);
    AJAX.TIMEOUT = null;
    if(AJAX.HTTP.status == 200) {
      AJAX.text = AJAX.HTTP.responseText;
      AJAX.xml = AJAX.HTTP.responseXML;
      //Если событие onload отслеживается, то сгенерируем его
      if(AJAX.onload !== null) AJAX.onload();
    }
    else if(AJAX.HTTP.status == 400) {
      AJAX.text = AJAX.HTTP.responseText;
      AJAX.xml = AJAX.HTTP.responseXML;

      //Если событие onload отслеживается, то сгенерируем его
      if(AJAX.onerror !== null) AJAX.onerror();
    }
    else {
      //Ошибка!!! Если событие onerror отслеживается, то сгенерируем его
      AJAX.errtext = AJAX.HTTP.statusText;
      if(AJAX.onerror !== null) AJAX.onerror(' 1');
    }
  }

}

//Две функции для добавления GET, POST параметров
AJAX.setGET = function(vname, value) {
  AJAX.GET[vname] = value;
}
AJAX.setPOST = function(vname, value) {
    AJAX.POST[vname] = value;
}

//Функция для отправки запроса серверу, в параметре передается путь и имя файла
AJAX.request = function(file) {
  var v;
  var post;
  AJAX.HTTP.abort(); //Закрываем предыдущие соеденение
  var url = file;

  AJAX.HTTP.onreadystatechange = onReadyStateChange;

  if(ar_length(AJAX.GET) !== 0) {
    url += "?";
    for(v in AJAX.GET) {
      url += v + "=" + encodeURIComponent(AJAX.GET[v]) + "&";
    }
  }

  if(ar_length(AJAX.POST) === 0) {
    AJAX.HTTP.open("GET", url, true);
    post = null;
  } else {

    AJAX.HTTP.open("POST", url, true);
    post = "";

    for(v in AJAX.POST) {
      post += v + "=" + encodeURIComponent(AJAX.POST[v]) + "&";
    }

    AJAX.HTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    AJAX.HTTP.setRequestHeader("Content-Length", post.length);
  }

  AJAX.HTTP.send(post);

  AJAX.GET  = new Array();
  AJAX.POST = new Array();
  AJAX.TIMEOUT = setTimeout("AJAX.etimeout();", 300000);
}

//Создадим функцию для обработки таймаута
AJAX.etimeout = function() {
  AJAX.HTTP.abort();
  AJAX.errtext = "Timeout";
  if(AJAX.onerror !== null) AJAX.onerror();
}
AJAX.onload = function() {
  //Здесь обрабатываем удачную загрузку
}
AJAX.onerror = function() {
 //здесь обрабатываем ошибки
}


// тупой JS не поддерживает length для ассоциативных массивов
function ar_length(ar)
{
    var i = 0;
    for(v in ar) {
        i = i + 1;
    }
    return i;
}
}