﻿//
// JScript File
//


//
// Объект: HTTPRequest (используем ООП в javaScript)
// 
//
function HttpRequest(handler)
{
    //***************************************   P R O P E R T I E S   *******************************************************************
    
    //
    // Объект, который отсылает запросы
    //
    var HTTPObject = null
 
    //
    // Хендлер, которому будем отсылать запросы
    //
    var Handler=null
 
    //
    // Внешний колбек
    //
    var Callback=null
    
    /// Требуемое действие
    var reqAction = null;
    
    // Функция, которая будет вызвана при ошибке
    this.errorHandler = null;
   
    //***************************************   C O N S T R U C T O R   *******************************************************************
    
    // Если в конструкторе был указан хендлер - используем его.
    if(handler)
        Handler=handler;
    
    // Пытаемся получить объект HTTP.
    try
    {
        HTTPObject = new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch(e)
    {
        try
        {
           HTTPObject = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch(e)
        {
            HTTPObject = false;
        }
    }
    
    // code for Mozilla, etc.
    if (window.XMLHttpRequest)
    {
        try
        {
           HTTPObject=new XMLHttpRequest()
        }
        catch(ex)
        {
        }
    }
    
    if(!HTTPObject && typeof XmlHttpRequest!='undefined')
    {
        HTTPObject = new XmlHttpRequest();
    }
    
    
    //
    // Обработка коллбека реквеста. Если указана внешний колбек - вызываем
    //   
    this.GenCallback = function()
    {  
        //Замечание 5: В случае ошибки взаимодействия (например, если сервер упал), 
        //при попытке доступа к переменной .status метода onreadystatechange будет сгенерировано исключение
    
        try
        {
            if(HTTPObject.readyState==4)
            {
                if(HTTPObject.status && HTTPObject.status==200)
                {   
                    //считаем траффик
                    AddTrafficOut(HTTPObject.responseText.length);
                    
                    //ВСЁ ok. Получили ответ. Можно вызывать внешний колбек, если он указан
                    if(Callback!=null)
                    {
                        var responce = HTTPObject.responseText;
                        Callback(responce);
                    }
                }      
                else
                {  
                    if (errorHandler)
                        errorHandler(orderEntryHTTP.status);
                    else    
                        MessageBox('Operation '+reqAction+' failed','Server error ' + cancelOrderHTTP.status,false,null);
                }  

            }
        }
        catch( e )
        {
            //alert('Произошло исключение: ' + e.description);
        }
    }
    
    //*******************************************    M E T H O D S ******************************************************************
    
 
    
    //
    // Отправка запроса.
    //
    this.SendRequest = function(action, params, callback)
    {
      
    
        //Если в параметрах был указан колбек - он вызовется, иначе нет
        if(callback)
            Callback = callback;
        else
            Callback = null;
            
        reqAction = action;    
        
        //Составляем текст запроса...
        var fullRequest = Handler+'?action='+action+params;
        
        //Считаем траффик
        AddTrafficIn(fullRequest.length);
        
        //... и отправляем его
        HTTPObject.open("POST", fullRequest, true);
        HTTPObject.onreadystatechange = this.GenCallback;
        //fixed by nicky
        //для POST-запросов недопустимо передавать null в теле запроса,
        //в отличие от GET, где все проще
        HTTPObject.send('');
    };
    
    
}