// Создание объекта XLXO (XL-XmlObject)
var XLXO = (function() {
  // Приватные свойства
  var DataSending = false; // Флаг "запрос отправляется"

  // Приватные методы
  function GetXMLObject() // Создает XML-объект HTTP-запросника
  {
    var XO = null;
    if(window.XMLHttpRequest)
    {
      XO = new XMLHttpRequest();
    }
    else if(window.ActiveXObject)
    {
      XO = new ActiveXObject("Microsoft.XMLHTTP");
    }
    return XO;
  }

  // Проверяем совместимость браузера
  if(GetXMLObject() == null)
  {
    alert('Воспользуйтесь браузером версии не ниже чем Opera v8.01, Internet Explorer v5.5, Mozilla, Safari');
    document.location = 'about:blank';
  }

  // Публичниые свойства и методы
  return {    IsDataSending: function () // Возвращает значение DataSending (Флаг "идёт обмен с сервером")
    {      return DataSending;    },    GetXMLDocument: function () // Создает пустой XML-объект типа документ
    {
      if(window.ActiveXObject) // code for IE
      {
        xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = false;
        return xmlDoc;
      }
      else if(document.implementation && document.implementation.createDocument) // code for Mozilla, etc.
      {
        xmlDoc = document.implementation.createDocument("", "dummy-root", null);
        xmlDoc.async = false;
        return xmlDoc;
      }
    },
    RequestServer: function (Method, Url, CallbackFunction, Parameter, Form) // Отправляет запрос серверу
    {      if(DataSending)
      {        return false;
      }
      else
      {
        DataSending = true;
      }
      var XO = GetXMLObject();
      var Query = null;
      if(XO)
      {
        if(!CallbackFunction)
        {
          DataSending = false;
          return true;
        }
        if(Method.toLowerCase() == 'post' && Form != null)
        {
          Query = [];
          for(i = 0; i < Form.length; i++)
          {
            if(Form[i].name != "")
            {
              switch(Form[i].type)
              {
                case "checkbox":
                  if(Form[i].checked)
                  {
                    Query.push(encodeURIComponent(Form[i].name) + "=" + encodeURIComponent('true'));
                  }
                  break;
                default:
                  Query.push(encodeURIComponent(Form[i].name) + "=" + encodeURIComponent(Form[i].value));
                  break;
              }
            }
          }
          Query = Query.join('&');
          //alert(Query);
          XO.onreadystatechange = function()
          {
            if((XO.readyState == 4 || XO.readyState == "complete") && CallbackFunction)
            {
              DataSending = false;
              CallbackFunction(XO.responseText, Parameter);
            }
          }
          XO.open("POST", Url, true);
          XO.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=windows-1251");
          XO.send(Query);
          return true;
        }
        else if(Method.toLowerCase() == 'get')
        {          XO.onreadystatechange = function()
          {
            if(XO.readyState == 4 || XO.readyState == "complete")
            {
              DataSending = false;
              if(CallbackFunction)
              {
                CallbackFunction(XO.responseText, Parameter);
              }
            }
          }
          XO.open("GET", Url, true);
          XO.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=windows-1251");
          XO.send(Query);
          return true;
        }
        return false;
      }
      return false;
    }
  }
})();

