var IdOfTimeout=null;
var asyncCmd = null;
var ajax_req = null;
var cbFunc   = null;
var GlassWindow=null;
var tgt = 'clientArea';
/* */
function abortAR()
 {
    ajax_req.abort();
    loaderPopUp('close');
    alert("Проблемы при соединением с серверной программой. Пожалуйста убедитесь в соединеии с Internet и попытайтесь снова позднее.");
 }
/* */
function postAjaxData(f, url)
 {
    var query = 'ajax=1' + makeQF(f);
    sendAR(query, url);
 }
/* Ф-ция посылки AJAX-запроса
 * postdata - строка GET|POST данных
 * скрипт   - обработчик запроса на сайте
 * interval - время после которого запрос будет 'убит' если он ещё не завершён
 * denylock - 1|0 нужно или нет накладывать защитный слой на время запроса 
 */
function sendAR(postdata,ajax_url,interval,denylock)
 {
    if(interval==null) interval=10000;
    else               interval=parseInt(interval,10)*1000;
    if(denylock==null) denylock = 0;
    if(ajax_url==null) ajax_url = window.location;
    if (window.XMLHttpRequest)
     {
        ajax_req = new XMLHttpRequest();
     }
    else
     {
       if (window.ActiveXObject)
         {
            var sign_a = ['MSXML2.XMLHTTP', 'Microsoft.XMLHTTP',
                          'MSXML2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.5.0',
                          'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0',
                         ];
            for (var i=0, l = sign_a.length; i<l; ++i)
             {
               try {  ajax_req = new ActiveXObject(sign_a[i]);  i = l; }
               catch(e) {}
             }
         }
     }
    if(ajax_req)
     {
       loaderPopUp('open',denylock);
       ajax_req.open("POST", ajax_url, true);
       IdOfTimeout = setTimeout(abortAR,interval);
       ajax_req.onreadystatechange = function() {
                                                  try
                                                   {
                                                     if (ajax_req.readyState == 4)
                                                      {
                                                         clearTimeout(IdOfTimeout);
                                                         if (ajax_req.status == 200)
                                                          {
                                                            CB(ajax_req,denylock);
                                                          }
                                                         else
                                                          {
                                                           alert("Ошибка POST-запроса AJAX:" + ajax_req.status + " " + ajax_req.statusText);
                                                          }
                                                      }
                                                   }
                                                  catch(err)
                                                   {
                                                      alert("Error: " + err.message);
                                                   }
                                                }
       ajax_req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
       ajax_req.send(postdata);
     }
    else
     {
        alert("Ваш броузер не разрешает использовать возможности приложения! Воспользуйтесь Internet Explorer, Mozilla-подобным броузером!");
     }
 }
/* */
function CB(httpRequest,denylock)
 {
    try
     {
      var re_xml = /^<\?xml/i;
      var re_json = /^{/i;
      loaderPopUp('close',denylock);
      if( re_xml.test(httpRequest.responseText) )
       {
          asyncCmd = null;
          var xmlDoc = httpRequest.responseXML;
          if(xmlDoc != null)
           {
              if(cbFunc)
               {
                  if(eval(("typeof("+cbFunc+")")) == "function")   eval((cbFunc+"(xmlDoc.documentElement)"));
                  cbFunc = null;
               }
              else if(eval("typeof(xmlAjaxCallBack)") == "function")  { xmlAjaxCallBack(xmlDoc.documentElement);  }
           }
          else
           {
               cbFunc = null;
               alert('Ошибка! Сервер вернул не валидный XML!');
           }
       }
      else if ( re_json.test(httpRequest.responseText) )
       {
           asyncCmd = null;
           var json_obj = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
           httpRequest.responseText.replace(/"(\\.|[^"\\])*"/g, ''))) &&
           eval('(' + httpRequest.responseText + ')');
           if(typeof(json_obj) == 'object')
            {
               if(cbFunc)
                {
                   if(eval(("typeof("+cbFunc+")")) == "function")   eval((cbFunc+"(json_obj)"));
                   cbFunc = null;
                }
               else if(eval("typeof(jsonCallBack)") == "function")  { jsonCallBack(json_obj); }
               else alert('Ошибка! Не обнаружена ф-ция обработчик JSON-объекта.');
            }
           else
            {
               cbFunc = null;
               alert('Ошибка! Сервер вернул не валидный JSON-объект!');
            }
       }
      else
       {
          cbFunc = null;
          if (typeof(winList)=='object' && winList['popupDiv'])
           {
             //winList['popupDiv'].clientArea.innerHTML = httpRequest.responseText;
             document.getElementById(tgt).innerHTML = httpRequest.responseText;
           }
          if(asyncCmd)
           {
              if(eval("typeof(doPostCmd)") == "function")   doPostCmd(asyncCmd);
              asyncCmd = null;
           }
       }
     }
    catch (err)
     {
       cbFunc = null;
       asyncCmd = null;
       alert(err.message);
     }
 }
/* */
function loaderPopUp(mode,denylock)
 {
   if(mode==null) mode="open";
   if(denylock==null) denylock=0;
   var divObj=document.getElementById("loaderDiv");
   var height=(window.innerHeight)?window.innerHeight:((document.all)?document.body.offsetHeight:null);
   switch(mode)
    {
      case "open":
       if(divObj && divObj.tagName=='DIV')
        {
          divObj.style.display="block";
          divObj.style.top = height/2 + document.body.scrollTop;
        }
       if(!denylock) ShowGlassWindow(true);
       break;
      case "close":
       if(divObj && divObj.tagName=='DIV')
        {
          divObj.style.display="none";
          divObj.style.top = height/2;
        }
       if(!denylock) ShowGlassWindow(false);
       break;
    }
 }
/* */
function ShowGlassWindow(show,innerHtml)
 {
    if(GlassWindow==null)
     {
        GlassWindow=document.createElement('DIV');
        with(GlassWindow.style)
         {
            display='none';
            position='absolute';
            height=0;
            width=0;
            zIndex = 100;
            if(document.all)
             {
                backgroundColor = '#ffffff';
                filter="progid:DXImageTransform.Microsoft.Alpha(Opacity=40, Style=0)";
             }
            else
             {
                backgroundImage = 'url(/img/alfa40-fon.png)';
             }
         }
        document.body.appendChild(GlassWindow);
     }
    if(show)
     {
        var s = [document.body.scrollWidth>document.body.offsetWidth?document.body.scrollWidth:document.body.offsetWidth, document.body.scrollHeight>document.body.offsetHeight?document.body.scrollHeight:document.body.offsetHeight];
        GlassWindow.innerHTML=(innerHtml==null)?"":innerHtml;
        with(GlassWindow.style)
         {
            left = top = 0;
            width = s[0]+'px';
            height = s[1]+'px';
            textAlign='center';
         }
     }
    GlassWindow.style.display=show?'block':'none';
 }
/* */
function makeQF(formObj,dataArr)
 {
   var elObjArr = new Array();
   var query='';
   if(dataArr && typeof(dataArr) == 'object')
    {
      for (var i=0,l=dataArr.length;i<l;i++)
       {
         var v=dataArr[i];
         var elObj=formObj.elements[v];
         if(elObj==null || typeof(elObj)=='undefined') continue;
         elObjArr.push(elObj);
       }
    }
   else
    {
      for (var i=0,l=formObj.elements.length;i<l;i++)
       {
         var elObj=formObj.elements[i];
         if(formObj.elements[i].name) elObjArr.push(elObj);
       }
    }
   for (var j=0,jl=elObjArr.length;j<jl;j++)
    {
      var elObj=elObjArr[j];
      if(elObj.length && elObj[0].type=='radio')
       {
          query+="&"+elObj[0].name+"="+getRadioValue(elObj);
          continue;
       }
      switch(elObj.tagName.toUpperCase())
       {
         case 'INPUT':
          switch(elObj.type.toLowerCase())
           {
             case "radio":
              if(elObj.length)        query+="&"+elObj.name+"=" + getRadioValue(elObj);
              else if(elObj.checked)  query+="&"+elObj.name+"=" + elObj.value;
              break;
             case "hidden": case "password":
              query+="&"+elObj.name+"="+elObj.value;  break;
             case "text":
              query+="&"+elObj.name+"="+replaceEscape(elObj.value);  break;
             case "checkbox":
              if(elObj.checked)
               {
                 query+="&"+elObj.name+"=" + ((elObj.getAttribute("value")==null)?1:elObj.value);
               }
              break;
             default: break;
           }
          break;
         case 'SELECT':
          if(elObj.multiple)
           {
             for(var c=0,cl=elObj.options.length;c<cl;c++)
              {
                query+=(elObj.options[c].selected)?("&"+elObj.name+"="+elObj.options[c].value):'';
              }
           }
          else query+="&"+elObj.name+"="+getSelectValue(elObj);
          break;
         case 'TEXTAREA':
          query+="&"+elObj.name+"="+ replaceEscape(elObj.value);
          break;
       }
    }
   return query;
 }

