var req;
var reqTimeout;

// выполняет запрос к серверу для любого браузера методом GET
function loadXMLDoc(url) {
    req = null;
    if (window.XMLHttpRequest) {
        try {
            req = new XMLHttpRequest();
        } catch (e){}
    } else if (window.ActiveXObject) {
        try {
            req = new ActiveXObject('Msxml2.XMLHTTP');
        } catch (e){
            try {
                req = new ActiveXObject('Microsoft.XMLHTTP');
            } catch (e){}
        }
    }

    if (req) {
        req.onreadystatechange = processReqChange; // устанавливаем для обработки событий свою функцию
        req.open("GET", url, true); // готовим асинхронный GET-запрос
        req.send(null); // отправляем его
        reqTimeout = setTimeout("req.abort();", 5000); // и ставим таймаут на отмену запроса
    } else {
        alert("Браузер не поддерживает передачу данных при помощи JavaScript");
    }
}

// Функция вызывается при каждом изменении состояния запроса
function processReqChange() {
    if (req.readyState == 4) {
        clearTimeout(reqTimeout);

        if (req.status == 200) { // Если ответ на запрос пришёл 'HTTP/1.1 200 OK'
            if (req.responseXML) { // Если ответ пришёл типа XML и соответственно был распарсен браузером
                var rdoc = req.responseXML.documentElement; // Выбираем корневой элемент распарсенного ответа
                // Название (тега) корневого элемента = имя javascript-функции, которую надо вызвать
                eval('try { '+rdoc.nodeName+'(rdoc) } catch(e) { alert ("Нет такой функции - '+rdoc.nodeName+'"); }'); // Если она есть, вызываем
            } else { // Ответ почему-то не был распарсен. Пытаемся обработать его с помощью специальной функции
                try { handleText(req.responseText); } catch(e) { alert ("Функция handleText не определена"); }
            }
        } else {
            alert("Не удалось получить данные:\n" + req.statusText); // иначе - ругаемся
        }
    }
}

// Для совместимости с моей старой реализацией ajax (там приходит ответ в виде <xml><reply/>...<reply/></xml>
function xml(doc) {
   var response = doc.getElementsByTagName('reply'); // Разбираем запрос
   for (var i=0; i<response.length; i++) {
      var rid = response[i].getElementsByTagName('id') [0].firstChild.data;
      var rdata = response[i].getElementsByTagName('data') [0].firstChild.data;
      var obj = document.getElementById(rid);
      if (obj) obj.innerHTML = rdata;

      var rjs = response[i].getElementsByTagName('js') [0].firstChild;
      if (rjs) eval(rjs.data);
   }
}

