/*
Создание XMLHttpRequest-объекта
Возвращает созданный объект или null, если XMLHttpRequest не поддерживается
*/
var asynchrone = false; //Ассинхроный режим передачи (в Firefox) или нет (IE)
function createRequestObject() {
    var request = null;
    
    if(!request) try {
        request=new ActiveXObject('Msxml2.XMLHTTP');
    } catch(e){}
    
    if(!request) try {
        request=new ActiveXObject('Microsoft.XMLHTTP');
    } catch(e){}
    
    if(!request) try {
        request=new XMLHttpRequest();
        asynchrone = true;
    } catch(e){}

    return request;
}



/*
Кодирование данных (простого ассоциативного массива вида { name : value, ...} в
URL-escaped строку (кодировка UTF-8)
*/
function urlEncodeData(data) {
    var query = [];
    if (data instanceof Object) {
        for (var k in data) {
            query.push(encodeURIComponent(k) + "=" + encodeURIComponent(data[k]));
        }
        return query.join('&');
    } else {
        return encodeURIComponent(data);
    }
}

/*
Выполнение запроса 
url  - адрес запроса
data - параметры в виде простого ассоциативного массива { name : value, ...} 
callback - (не обяз.) callback-функция, которая будет вызвана после выполнения запроса и получения ответа от сервера
*/
function serverRequest(method, url, data, callback, xsl_path, res_div) {
    var request = createRequestObject();


    if(!request) return false;
    
    request.onreadystatechange  = function() { 
            if (request.readyState == 4) {
                if (document.getElementById('loading')) document.getElementById('loading').style.display = 'none';
            	if (callback) callback(request, xsl_path, res_div);
            }
    };
    
    if (document.getElementById('loading')) {
    	document.getElementById('loading').style.display = 'block';
    	
    	document.getElementById('loading').style.top = document.body.scrollTop;
    	document.getElementById('loading').style.left = document.body.scrollLeft;
    }

    request.open(method, url, asynchrone);
    request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");  
    request.send(urlEncodeData(data));

    return true;
}


var data=new Array();


function debug(obj, xsl_path, res_div) {
	alert(obj.responseText);
}

function render(obj, xsl_path, res_div) {
	
	xmldoc = obj.responseXML;
//alert(obj.responseText);
    // for native XMLHttpRequestObject
    if (window.XMLHttpRequest && window.XSLTProcessor) {
    	isIE = false;
        try {
            xslreq = new XMLHttpRequest();
            proc   = new XSLTProcessor();
        } catch(e) {
            alert('Ошибка инициализации:\n'+e.message);
        }

        if (xslreq && proc) {
            xslreq.open("GET", xsl_path, false);
            xslreq.send(null);
    
            proc.importStylesheet(xslreq.responseXML);
         
            viewDoc(res_div);
        }
   }

   // for IE/Windows ActiveX
     else if (window.ActiveXObject) {
         isIE = true;
         try {
             var xslt = new ActiveXObject('MSXML2.XSLTemplate');
             var xsldoc = new ActiveXObject('MSXML2.FreeThreadedDOMDocument');
         } catch(e) {
             alert('Ошибка инициализации:\n'+e.message);
         }

         if (xsldoc && xslt) {
             xmldoc.async = false;
             xsldoc.async = false;
         
             if (xmldoc.parseError.errorCode != 0 ) {
                alert('Ошибка загрузки XML документа:\n'+xmldoc.parseError.reason);
             } else if (xsldoc.parseError.errorCode != 0) {
                alert('Ошибка загрузки XSL документа:\n'+xsldoc.parseError.reason);
             }
             
             xsldoc.load(xsl_path);

             xslt.stylesheet = xsldoc;

             proc = xslt.createProcessor();
             proc.input = xmldoc;
             
             viewDoc(res_div);
         }

     } else {
         alert('Отсутствует поддержка HTTPRequest/XML/XSLT');
     }
}

function viewDoc(res_div) {
   if (isIE) {
      proc.addParameter('current','');
      proc.transform();
      res_div.innerHTML = proc.output;
   } else {
      proc.setParameter(null,"current",'');
      res_div.innerHTML = "";
      res_div.appendChild(proc.transformToFragment(xmldoc,document));
   }
}
