var a = new AjaxRequest();
a.async = true; 
var cars = {};
var url = '/auto/info';
var a_mode;
a.onready = function ()
  {
   var m = a.mode;
   a.inprogress = false;
   alert(r.text);
   var r;
   if( (r = a.response) && (r.code == 200) )
     {
      try
        {
         var d;
         eval("d = "+r.text+";");
         if(d)
           mode(m,d);
        }
      catch(e)
        {
         //console.error(e.message);
        }
     }
  }
function LoadReady(text,xml,status,headers)
  {
   var m = a_mode;
   try
     {
      var d;
      eval("d = "+text+";");
      if(d)
        mode(m,d);
      //---
     }
   catch(e)
     {
      console.error(e.message);
     }
  }
function getData(m,u)
  {
   a_mode = m;
   Ajax.get(u,false,
         {
          onrequestready:LoadReady,
          onrequesterror:ModelsError
         }
        );
   /*
   if(a.inprogress) return false;
   a.inprogress = true; 
   a.mode = m;
   a.openGET(u);
   */
  }

function mode(m, data)
  {
   var f = document.forms["advert"];
   var editmodel=document.getElementById("editmodel");
   if(editmodel) editmodel.style.display="none";
   switch(m)
     {
      case 0:
        f.rubrika.selectedIndex = 0;
        f.marka.nextSibling.style.display = 'none';
        f.marka.style.display = 'inline';
        //---        
        document.getElementById("marka").style.visibility = 'hidden';
        document.getElementById("data").style.display = 'none';
        //---
        f.rubrika.nextSibling.style.display = 'none';
        f.rubrika.style.display = 'inline';
        f.rubrika.disabled = false;
        break;
      case 1:
        var t = f.rubrika.value;
        //f.rubrika.disabled = true;
        //---
        if(data) cars[t] = data;
        var d;
        //---
        if(t)
         if(! (d = cars[t]))
          {
           getData(m,url+'?r='+ encodeURIComponent(t) );
           break; 
          }
         else
          {
           var c = f.marka;
           while(c.childNodes.length>0)
             c.removeChild(c.lastChild);
           //---
           for(var i in d)
             {
              var o = document.createElement("option");
              o.value = i;
              if(d[i].length)
                {
                 o.innerHTML = d[i];
                 d[i] = {name:d[i]};
                }
              else
                o.innerHTML = d[i].name;
              c.appendChild(o);
             }
           //---
           f.rubrika.nextSibling.style.display = 'inline';
           f.rubrika.nextSibling.innerHTML = f.rubrika.options[f.rubrika.selectedIndex].text;
           f.rubrika.style.display = 'none';
           //---
           document.getElementById("marka").style.visibility = 'visible';
           document.getElementById("data").style.display = 'none';
           f.model.style.display = 'none';
           f.marka.nextSibling.style.display = 'none';
           f.model.nextSibling.style.display = 'none';
           f.marka.style.display = 'inline';
           f.marka.disabled = false;
          }
        break;
      case 2:
        var t = f.rubrika.value;
        var marka = f.marka.value;
        //f.marka.disabled = true;
        //---
        if(data) cars[t][marka].models = data;
        var d;
        //---
        if(t)
          if(! (d = cars[t][marka].models))
            {
             getData(m,url+"?m="+encodeURIComponent(marka)+"&t="+ encodeURIComponent(t));
             break;
            }
          else
            {
             var c = f.model;
             while(c.childNodes.length>0)
               c.removeChild(c.lastChild);
             //---
             for(var i in d)
               {
                var o = document.createElement("option");
                o.value = i;
                o.innerHTML = d[i];
                c.appendChild(o);
               }
             //---
             f.marka.nextSibling.style.display = 'inline';
             f.marka.nextSibling.innerHTML = f.marka.options[f.marka.selectedIndex].text;
             f.marka.style.display = 'none';
             //---
             c.style.display = 'inline';
             f.model.nextSibling.style.display = 'none';
             //---
             document.getElementById("data").style.display = 'none';
            }
        break;
      case 3:
        f.model.nextSibling.innerHTML = f.model.options[f.model.selectedIndex].text;
        f.model.nextSibling.style.display = 'inline';
        f.model.style.display = 'none';
        //---
        document.getElementById("data").style.display = 'block';
        document.getElementById("title").innerHTML = f.marka.options[f.marka.selectedIndex].text+' '+f.model.options[f.model.selectedIndex].text 
        break;
     }
  }

function clickNotify(o)
  {
   o.nextSibling.style.fontWeight = (o.checked)?'bold':'normal';
   return true;
  }
  
function addOption(o)
  {
   var s;
   if(( s = prompt("","") ))
     {
      var i = document.createElement("input");
      i.type = "checkbox";
      i.value = s;
      i.onclick = function () {return clickNotify(this);};
      i.style.marginRight = '10px';
      o.parentNode.insertBefore(i,o);
      //---
      i = document.createElement("span");
      i.innerHTML = s;
      o.parentNode.insertBefore(i,o);
      o.parentNode.insertBefore(document.createElement("br"),o);
     }
  }
/**
 * 
 * @param {HTMLElement} a
 */
function showColorWindow(a)
  {
   var x = 0;
   var y = 0;
   do
     {
      x+=a.offsetLeft;
      y+=a.offsetTop;
      a = a.offsetParent;
     }
   while(a && a.className != 'main-text');
   var d;
   (d = document.getElementById('color_div')).style.left = x - 9 + 'px';
   d.style.top = y - 4 + 'px';
   //---
   //if(d.active)
   //  d.active.style.border = "2px solid #ffffff";
   //---
   d.style.display = 'block';
   d.style.visibility='visible';
  }

function colorClick(o,id)
  {
   var d = document.getElementById('color_div');
   //---
   if(o.nodeName != 'INPUT')
     {
      if(d.active) d.active.style.border = "2px solid #ffffff";
      o.style.border = "2px solid #a8a8a8";
      d.active = o;
      document.forms['advert'].color.value=id;
     }
   else
    {
     document.forms['advert'].is_metalik.value=(o.checked==true?'1':'0');
    }
  }

function hideColorWindow(f)
  {
   var d = document.getElementById('color_div');
   if(f && d.active)
     {
      var s=document.getElementById("colorsample");
      s.style.backgroundColor = d.active.style.backgroundColor;
      if(document.forms['advert'].is_metalik.value=='1') s.innerHTML='M';
      s.style.display = 'block';
     }
   //---
   d.style.display = 'none';
  }
  
function EnabledSubmit()
  {
   var d = document.getElementById('rule');
   var submit=document.getElementById('submit');
   if(d && submit)
     {
      submit.disabled=!d.checked;
     }
  }
function select_ads_all(sel)
  {
   var form=document.forms['noteadd'];
   var check_all=document.getElementById('check_all');
   if(!sel) sel=1;
   for(var i=0;i<form.elements.length; i++)
     {
      if(form.elements[i].name.substr(0,3)=='ads') form.elements[i].checked=(sel==1?check_all.checked:false);
     }
  }
//---
function SendNote(form)
  {
   note = new AjaxRequest();
   note.asyncrone = true;
   note.onready = function (o) { 
      o.response;
      var count_note=parseInt(o.response.text);
      var id_note=document.getElementById('count_note');
      if(id_note && count_note>0)
        {
         id_note.innerHTML="Мой блокнот ("+count_note+")";
         alert("Объявления успешно добавлены в блокнот!");
        }
      select_ads_all(-1);
   }
   note.ontimeout = function (o) {
      alert(o.response.text);
   }
   note.sendForm(form);
  }
//---
function DeleteNote(form)
  {
   form.submit();
  }

function ValidateForm(forma)
  {
   var error_msg='';
   if(forma.year.value=='') error_msg+='Не заполнено поле Год выпуска.<br>';
   if(forma.probeg.value=='' && !forma.whithout_probeg.checked) error_msg+='Не заполнено поле Пробег.<br>';
   if(forma.price.value=='') error_msg+='Не заполнено поле Цена.<br>';
   if(error_msg!='')
     {
      alert('Не все поля заполнены корректно!');
      var error=document.getElementById('error');
      error.innerHTML=error_msg;
      return false;
     }
   return true;
  }
//---
function GetModels()
  {
   var f = document.forms["filter_auto"];
   var marka = f.marka.value;
   //---
   Ajax.get(url+"?m="+encodeURIComponent(marka)+"&t=1",false,
         {
          onrequestready:ModelsLoad,
          onrequesterror:ModelsError
         }
        );
  }
function ModelsLoad(text,xml,status,headers)
{
   var f = document.forms["filter_auto"];
   var marka = f.marka.value;
   //---
   try
   {
    var d;
    eval("d = "+text+";");
    if(d)
      {
       var c = f.model;
       while(c.childNodes.length>1)
          c.removeChild(c.lastChild);
       //---
       for(var i in d)
         {
          var o = document.createElement("option");
          o.value = i;
          o.innerHTML = d[i];
          c.appendChild(o);
         }
      }
   }
 catch(e)
   {
    console.error(e.message);
   }
}
function ModelsError()
  {
   alert("На сервере произошла ошибка!\r\nНапишите, пожалуйста, письмо с тем, что Вы делали и мы обязательно исправим ошибку!")
  }
//---
function ShowFormSearch()
  {
   var fsearch=document.getElementById("search_form");
   if(fsearch)
     {
      //var coord = getPageSize();
      //MouseX = 100;
      //MouseY = 200;
      //fsearch.style.left=MouseX+"px";
      //fsearch.style.top =MouseY+"px";
      fsearch.style.display="block";
      //fsearch.style.visibility = "visible";
     }
  }
//---
function HideSearchForm()
  {
   var fsearch=document.getElementById("search_form");
   if(fsearch)
     {
      fsearch.style.display = "none";
      //fsearch.style.visibility = "hidden";
     }
  }
//---
function getPageSize()
  {
   if(navigator.appName=="Microsoft Internet Explorer")
     {
      var doc_element=document.documentElement;
      return([(doc_element.clientWidth ? doc_element.clientWidth : document.body.clientWidth), 
              (doc_element.clientWidth ? doc_element.clientHeight: document.body.clientHeight)]);
     }
   else
      return([document.body.clientWidth, document.body.clientHeight]);
  }
//---
function edit_comment(id)
  {
   var comment=document.getElementById('content'+id);
   var comment_edit=document.getElementById('id_comment');
   var save_div=document.getElementById('comment_save_cmd');
   var new_div=document.getElementById('comment_new_cmd');
   if(comment && comment_edit && save_div && new_div)
     {
      document.addcomment.id.value=id;
      comment_edit.value=comment.innerHTML;
      new_div.style.display="none";
      save_div.style.display="block";
     }
  }
//---
function edit_comment_cancel()
  {
   var comment_edit=document.getElementById('id_comment');
   var save_div=document.getElementById('comment_save_cmd');
   var new_div=document.getElementById('comment_new_cmd');
   if(comment_edit && save_div && new_div)
     {
      document.addcomment.id.value=0;
      comment_edit.value='';
      new_div.style.display="block";
      save_div.style.display="none";
     }
   
  }
//---
function showFullHarakteristik()
  {
   var harakt_edit=document.getElementById('tr_har');
   if(harakt_edit)
     {
      if(harakt_edit.style.display=='none' || harakt_edit.style.display=='') harakt_edit.style.display='block';
      else                                                                   harakt_edit.style.display='none';
     }
  }
//---
function getModel()
  {
   var f = document.forms["editstatic"];
   var marka = f.marka.value;
   //---
   amodels = new AjaxRequest();
   amodels.async = true;
   amodels.onready = function (o) {
      var r;
      if( (r = o.response) && (r.code == 200) )
        {
         try
           {
            var d;
            eval("d = "+r.text+";");
            if(d)
              {
               var c = f.model;
               while(c.childNodes.length>1)
                  c.removeChild(c.lastChild);
               //---
               for(var i in d)
                 {
                  var o = document.createElement("option");
                  o.value = i;
                  o.innerHTML = d[i];
                  c.appendChild(o);
                 }
               c.disabled=false;
              }
           }
         catch(e)
           {
            console.error(e.message);
           }
        }
   }
   amodels.ontimeout = function (o) {
      alert("Ошибка!");
   }
   amodels.inprogress = false;
   
   amodels.openGET(url+"?m="+encodeURIComponent(marka)+"&t=1");
  }
(function() {
   var Ajax = window.Ajax = {},
      connections = [],
      defaultTimeout = 240000; // 4 минуты. Ждеми ответа сервера не более этого времени
   /**
   * Создает объект XMLHttpRequest, или достает имеющийся из очереди
   */
   function request() {
       var ajax = connections.shift();
       if (ajax) return ajax;
       try {
           if (window.XMLHttpRequest)
               ajax = new XMLHttpRequest();
           else if (window.ActiveXObject) {
               try {
                   ajax = new ActiveXObject("Msxml2.XMLHTTP");
               }
               catch (e) {
                   ajax = new ActiveXObject("Microsoft.XMLHTTP");
               }
           }
       }
       catch (e) {
           ajax = null;
       }
       return ajax;
   }
   /**
   * Помещает отработавший XMLHttpRequest в очередь свободных
   * @param {XMLHttpRequest} ajax
   */
   function return_connection(ajax) {
       ajax.abort();
       connections.push(ajax);
   }
   /**
   * Превращает строку с заголовками в объект, где имена это заголовки
   * @param {String} str загловки раздеоенные символом \n
   */
   function headers(str) {
       var i, d, res = {};
       if (!str) return res;
       str = str.split('\n');
       for (i = str.length - 1; i >= 0; --i) {
           d = str[i].split(':');
           if (d.length != 2) continue;
           res[d[0].toLowerCase().replace(/^\s+|\s+$/g, "")] = d[1].replace(/^\s+|\s+$/g, "")
       }
       return res;
   }
   /**
   * Вытаскивает из объекта возврата callback для успешного запроса и вызывает его с
   * указанными параметрами
   * 
   * @param {Object}         callback  Объект содержащия данные для возврата
   * @param {String}         text      Текст ответа
   * @param {XMLRootElement} xml       XML объект ответа
   * @param {String}         status    Статусное сообщение ответа
   * @param {String}         header    Заголовки ответа
   */
   function call_onready(callback, text, xml, status, header) {
       var f;
       (f = callback.onrequestready) || (f = callback.onready);
       try {
           if (f)
               f.call(callback, text, xml, status, headers(header));
       }
       catch (e)
       { alert(e.message); }
   }
   /**
   * Вытаскивает из объекта возврата callback для нудачного запроса и вызывает его с
   * указанными параметрами
   * 
   * @param {Object}         callback       Объект содержащия данные для возврата
   * @param {Numeric}        status         Статус HTTP ответа
   * @param {String}         text           Текст ответа
   * @param {XMLRootElement} xml            XML объект ответа
   * @param {String}         status_text    Статусное сообщение ответа
   * @param {String}         header         Заголовки ответа
   */
   function call_onerror(callback, status, text, xml, status_text, header) {
       var f;
       (f = callback.onrequesterror) || (f = callback.onerror);
       try {
           if (f)
               f.call(callback, status, text, xml, status_text, headers(header));
       }
       catch (e)
       { alert(e.message); }
   }
   /**
   * Подготавливает ответ
   * @param {XMLHttpRequest} ajax
   * @param {Object}         callback
   */
   function response(ajax, callback) {
       if (!callback) return;
       var status, text, xml, status_text, head;
       try { status = ajax.status } catch (e) { }
       try { text = ajax.responseText } catch (e) { }
       try { xml = ajax.responseXML } catch (e) { }
       try { status_text = ajax.statusText } catch (e) { }
       try { head = ajax.getAllResponseHeaders() } catch (e) { }

       switch (status) {
           case 200:
               /* опера всегда говорит 200, даже если ей не удалось подколючится. Но не возвращает
               * заголовки. Предполагаем что в нормальном ответе заголовки должны присутствовать
               * и заносим ответы без них в ошибки
               */
               if (head) {
                   call_onready(callback, text, xml, status_text, head);
                   break;
               }
               else {
                   status = 0;
                   status_text = "";
               }
           default:
               call_onerror(callback, status, text, xml, status_text, head);
       }
   }
   /**
   * Объединяет параметры в url-encoded-data строку 
   * @param {Object} params Параметры в виде JS объекта
   */
   function get_params(params) {
       var name, i, l;
       param = [];
       if (params instanceof Array)
           for (i = 0, l = params.length; i < l; ++i)
           param.push([params[i][0], encodeURIComponent(params[i][1])].join('='))
       else
           for (name in params)
           param.push([name, encodeURIComponent(params[name])].join('='))

       return param.join('&');
   }
   /**
   * Объединяет параметры в multipart-form-data строку
   * @param {Object} params    Параметры в виде JS объекта
   * @param {String} boundary  Строковый разделитель
   */
   function multipart_params(params, boundary) {
       var param = [], name, i, l;

       function addParam(name, value) {
           param.push('--'); param.push(boundary);
           param.push('\r\nContent-Disposition: form-data; name="');
           param.push(name); param.push('"');
           if (value.filename) {
               param.push(';filename="')
               param.push(value.filename);
               param.push('"');
           }
           param.push('\r\n\r\n');
           if (value.value)
               param.push(value.value);
           else
               param.push(value);
           param.push('\r\n');
       }
       if (params instanceof Array)
           for (i = 0, l = params.length; i < l; ++i)
           addParam(params[i][0], params[i][1]);
       else
           for (name in params)
           addParam(name, params[name]);

       param.push('--'); param.push(boundary); param.push('--\r\n');
       return param.join('');
   }
   /**
   * Организует отправку формы через IFrame. При этом явно вызывается submit 
   * @param {HTMLForm} form      Форма которую необходимо отправить
   * @param {Function} onready   Callback вызываемый в случае успешной отправки
   * @param {Function} onerror   Callback вызываемый в случае неудочной отправки
   * @param {Mixed}    data      данные передаваемые калбекам
   */
   function sendOverFrame(form, callback) {
       var doc = form.ownerDocument,
         frame = doc.createElement('iframe'),
         s,
         name = ["upload_frame", Math.random()].join('_');

       (s = frame.style).position = "absolute";
       s.left = s.top = "-30000px";
       frame.name = name;
       frame.id = name;
       form.parentNode.insertBefore(frame, form);
       form.target = name;
       /**
       * Следующие строки могу ввести в ступор неподготовленного человека.
       * Да это действительно похоже на бред, но тем не менее это не он.
       * Дело в том что IE почему-то не проставляет name фрейму вставленному
       * динамически в контент. Причем в список фреймов он его добавляет с его id.
       * Поэтому мы ставим name руками если есть такая необходимость.
       */
       (s = form.ownerDocument.parentWindow) || (s = form.ownerDocument.defaultView);
       if (s.frames[name].name != name) s.frames[name].name = name;

       setTimeout(function() {
           var interval = window.setInterval(
                                     function() {
                                         var a;
                                         try {
                                             (a = frame.contentWindow) && (a = a.document) && (a.getElementById(""));
                                         }
                                         catch (e) {
                                             call_onerror(callback, 0, "", null, "", "");
                                             clearInterval(interval);

                                             frame.onload = frame.onreadystatechange = null;

                                             setTimeout(function() {
                                                 frame.parentNode.removeChild(frame);
                                             }, 0);
                                         }
                                     }
                                     , 2000);



           frame.onload = function() {
               clearInterval(interval);

               //--- попробуем найти мету
               try {
                   var m = this.contentWindow.document.getElementsByTagName('meta'),
                  error = false;

                   for (var i = 0, len = m.length; i < len; ++i)
                       if (m[i].name == 'TW_RESULT' && m[i].content.toUpperCase() == 'ERROR') {
                       error = true;
                       break;
                   }

                   if (!error)
                       call_onready(callback, this.contentWindow.document.body.innerHTML,
                            this.contentWindow.document, null, "");
                   else
                       call_onerror(callback, 0, this.contentWindow.document.body.innerHTML, this.contentWindow.document, "", "");
               }
               catch (e) {
                   //--- загрузилось, да не то
                   call_onerror(callback, 0, "", null, "", "");
               }

               frame.onload = frame.onreadystatechange = null;
               setTimeout(function() {
                   try {
                       frame.parentNode.removeChild(frame);
                       form.target = '';
                   }
                   catch (e) { }
               }, 0);
           }

           frame.onreadystatechange = function() {
               if (this.readyState == 'complete') {
                   clearInterval(interval);
                   try {
                       var m = this.contentWindow.document.getElementsByTagName('meta'),
                     error = false;

                       for (var i = 0, len = m.length; i < len; ++i)
                           if (m[i].name == 'TW_RESULT' && m[i].content.toUpperCase() == 'ERROR') {
                           error = true;
                           break;
                       }

                       if (!error)
                           call_onready(callback, this.contentWindow.document.body.innerHTML,
                                this.contentWindow.document, null, "");
                       else
                           call_onerror(callback, 0, this.contentWindow.document.body.innerHTML, this.contentWindow.document, "", "");
                   }
                   catch (e) {
                       //--- загрузилось, да не то
                       call_onerror(callback, 0, "", null, "", "");
                   }
                   frame.onload = frame.onreadystatechange = null;

                   setTimeout(function() {
                       try {
                           frame.parentNode.removeChild(frame);
                           form.target = '';
                       }
                       catch (e) { }
                   }, 0);
               }
           }

           form.submit();
       }, 100);
   }

   function stop(ajax) {
       ajax.abort();
   }

   function stopper(ajax) {
       return {
           ajax: ajax,
           timeout: setTimeout(function() { stop(ajax); }, defaultTimeout)
       };
   }
   /**
   * Отправка запроса методом GET
   * 
   * @param {String}   url      URL на который идет отправка
   * @param {Object}   params   Параметры для отправки
   * @param {Function} onready  Функция будет вызвана в случае успешной отправки (код ответа 200)
   * @param {Function} onerror  Функция будет вызвана в случае ошибки. Все прочие коды, включая 0 - не удалось дождаться ответа от сервера, или соединится с ним
   * @param {Mixed}    data     Данные которые будут переданы в функцию. Можно использовать для обратной связи
   */
   Ajax.get = function(url, params, callback) {
       var ajax = request(), sep,
         stop = stopper(ajax);
       if (!ajax) { if (onerror) onerror(); return; }
       //---
       params = get_params(params);
       sep = url.indexOf('?') == -1 ? '?' : '&';
       ajax.open('get', params ? [url, params].join(sep) : url, true);
       ajax.setRequestHeader("X-Requested-With", "XMLHttpRequest");
       ajax.onreadystatechange = function() {
           switch (ajax.readyState) {
               case 4:
                   if (stop) {
                       clearTimeout(stop.timeout);
                       stop.ajax = null;
                       stop = null;
                   }
                   //---
                   response(ajax, callback);
                   return_connection(ajax);
                   break;
           }
       }
       try {
           ajax.send('');
       }
       catch (e) { return (false); }
       return stop;
   }
   /**
   * Отправка запроса методом POST
   * 
   * @param {String}   url       URL на который идет отправка
   * @param {Object}   params    Параметры для отправки
   * @param {Boolean}  multipart Признак того что запрос необходимо закодировать как multipart-form-data
   * @param {Function} onready  Функция будет вызвана в случае успешной отправки (код ответа 200)
   * @param {Function} onerror  Функция будет вызвана в случае ошибки. Все прочие коды, включая 0 - не удалось дождаться ответа от сервера, или соединится с ним
   */
   Ajax.post = function(url, params, multipart, callback) {
       var ajax = request(),
         stop = stopper(ajax);
       ajax.open('post', url, true);
       ajax.setRequestHeader("X-Requested-With", "XMLHttpRequest");
       if (!multipart) {
           ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
           params = get_params(params);
       }
       else {
           ajax.setRequestHeader('Content-Type', 'multipart/form-data; boundary=AJAX----FORM');
           params = multipart_params(params, 'AJAX----FORM');
       }

       ajax.onreadystatechange = function() {
           switch (ajax.readyState) {
               case 4:
                   if (stop) {
                       clearTimeout(stop.timeout);
                       stop.ajax = null;
                       stop = null;
                   }
                   //---
                   response(ajax, callback);
                   return_connection(ajax);
                   break;
           }
       }

       try {
           ajax.send(params);
       }
       catch (e) { return (false); }
       return stop;
   }
   /**
   * Отправка формы. Данные для отправки, метод и прочее берутся из самой формы. Если форма содержит
   * файлы, она будет отправлена через iframe
   * 
   * @param {HTMLForm} form     Форма для отпрвки
   * @param {Function} onready  Функция будет вызвана в случае успешной отправки (код ответа 200)
   * @param {Function} onerror  Функция будет вызвана в случае ошибки. Все прочие коды, включая 0 - не удалось дождаться ответа от сервера, или соединится с ним
   */
   Ajax.form = function(form, callback) {
       var params = [], elems = form.elements;
       for (var i = 0, l = elems.length; i < l; ++i) {
           var elem = elems[i];
           switch (elem.type.toLowerCase()) {
               case 'file':
                   sendOverFrame(form, callback);
                   return false;
               case 'text':
               case 'password':
               case 'hidden':
               case 'submit':
               case 'image':
                   if (elem.name)
                       params.push([elem.name, elem.value]);
                   continue;
               case 'checkbox':
               case 'radio':
                   if (elem.name && elem.checked)
                       params.push([elem.name, elem.value ? elem.value : 'on']);
                   continue;
           }
           if (elem.nodeName == 'TEXTAREA' && elem.name)
               params.push([elem.name, elem.value]);
           else if (elem.nodeName == 'SELECT' && elem.name)
               params.push([elem.name, elem.value]);
       }
       if (form.method.toLowerCase() == 'post')
           Ajax.post(form.action, params, (form.enctype == 'multipart/form-data'), callback);
       else
           Ajax.get(form.action, params, callback);
   }
   /**
   * Останавливает запрос.
   * @param {Object} brakes  Нечто возвращеное методами get или post
   */
   Ajax.stop = function(brakes) {
       var a;
       if (!brakes || !(a = brakes.ajax)) return;
       clearTimeout(brakes.timeout);
       a.onreadystatechange = null;
       stop(a);
   }

   Ajax.url = function(url, params) {
       var p = url.split('?');
       url = p[0];
       params = get_params(params);
       return [url, params].join('?');
   }
}
)();
var img_close = document.createElement('img');
img_close.src = '/i/logout.gif';

window.DialogWindow =
{

    layer: null,
    content: null,
    caption: null,
    back: null,

    state: false,
    dx: 0,
    dy: 0,
    maxwidth: 0,
    maxheight: 0,

    setBackSize: function() {
        var s;
        (s = DialogWindow.back.style).width = '100%';
        var sizes = box.getPageSize();
        s.height = sizes[1] + 'px';

    },

    show: function(title, html, width, height, hidden_fields) {

        html = html.replace(/id="PREFIX/g, 'id="');
        html = html.replace(/id=PREFIX/g, 'id=');
        function setSize() {
            var s;
            (s = DialogWindow.layer.style).width = width + 'px';
            s.height = height + 'px';
            (s = DialogWindow.content.style).width = width - ((!window.MSIE5) ? 4 : 0) + 'px';
            s.height = height - 40 - ((!window.MSIE5) ? 4 : 0) + 'px';
        }
        function MakeHiddenField(name, value)
          {
           var hd = document.getElementById(name);
           if(!hd) hd   = document.createElement('input');
           hd.type  = 'hidden';
           hd.value = value;
           hd.name  = name;
           hd.id    = name; 
           document.body.appendChild(hd);
          }

        function makeWindow() {
            var back = (DialogWindow.back = document.createElement('div'));
            back.className = 'window-disabler';
            back.innerHTML = '&nbsp;';
            document.body.appendChild(back);
            //---
            var layer = (DialogWindow.layer = document.createElement('div'));
            layer.className = 'window-dialog';
            //---
            var caption = (DialogWindow.caption = document.createElement('div'));
            caption.className = 'window-caption';
            caption.innerHTML = '<span style="font-size:1px;">&nbsp;</span>';
            layer.appendChild(caption);
            //---
            var a = document.createElement('span');
            a.innerHTML = title;
            caption.insertBefore(a, caption.lastChild);
            //---
            a.onclick = function(e) {
                if (!e) e = window.event;
                //---
                if (e.stopPropagation)
                    e.stopPropagation();
                else
                    e.cancelBubble = true;
                return false;
            }
            //---
            img_close.onclick = DialogWindow.close;
            caption.insertBefore(img_close, caption.lastChild);
            //---
            var content = (DialogWindow.content = document.createElement('div'));
            content.className = 'window-content';
            layer.appendChild(content);
            //---
            document.body.appendChild(layer);
            //---
            if (window.opera) {
                caption.onmousedown = DialogWindow.down;
                document.addEventListener('mouseup', DialogWindow.up, true);
                caption.addEventListener('mouseup', DialogWindow.up, true);
                back.onmousemove = DialogWindow.move;
                layer.addEventListener('mousemove', DialogWindow.move, true);
                window.addEventListener('resize', DialogWindow.setBackSize, true);
            }
            else if (document.addEventListener) {
                document.addEventListener('mouseup', DialogWindow.up, true);
                caption.addEventListener('mouseup', DialogWindow.up, true);
                back.addEventListener('mousemove', DialogWindow.move, true);
                layer.addEventListener('mousemove', DialogWindow.move, true);
                caption.addEventListener('mousedown', DialogWindow.down, true);
                window.addEventListener('resize', DialogWindow.setBackSize, true);
            }
            else {
                document.attachEvent('onmouseup', DialogWindow.up);
                caption.attachEvent('onmouseup', DialogWindow.up);
                back.attachEvent('onmousemove', DialogWindow.move);
                layer.attachEvent('onmousemove', DialogWindow.move);
                caption.attachEvent('onmousedown', DialogWindow.down);
                window.onresize = DialogWindow.setBackSize;
            }
        };
        //--- ???? ????? ??????? ??????? ????
        if (hidden_fields) 
          {
           for(key in hidden_fields)
             {
              MakeHiddenField(key,hidden_fields[key]);
             }
          }

        if (!DialogWindow.layer)
            makeWindow();
        //---
        this.setBackSize();
        setSize();

        DialogWindow.content.innerHTML = html;

        DialogWindow.dx = DialogWindow.dy = 0;

        var y, x;
        if (!window.MSIE) {
            y = Math.ceil((document.documentElement.clientHeight / 2) - (height / 2));
            x = Math.ceil((document.documentElement.clientWidth / 2) - (width / 2));
            //y = Math.ceil((window.innerHeight / 2) - (height / 2));
            //x = Math.ceil((window.innerWidth / 2) - (width / 2));
        }
        else if (!window.MSIE5) {
            y = Math.ceil((document.documentElement.clientHeight / 2) - (height / 2));
            x = Math.ceil((document.documentElement.clientWidth / 2) - (width / 2));
        }
        else {
            y = Math.ceil((document.documentElement.scrollHeight / 2) - (height / 2));
            x = Math.ceil((document.documentElement.scrollWidth / 2) - (width / 2));
        }

        y += document.documentElement.scrollTop;
        x += document.documentElement.scrollLeft;
        DialogWindow.setPos(x, y);

        DialogWindow.back.style.display = 'block';
        DialogWindow.layer.style.display = 'block';
        DialogWindow.maxwidth = document.documentElement.clientWidth - width;
        DialogWindow.maxheight = document.documentElement.scrollHeight - height;
        if (document.getElementById('forum_user_login') && document.getElementById('forum_user_login').value == '') { document.getElementById('forum_user_login').focus(); }
        if (document.getElementById('forum_user_login') && document.getElementById('forum_user_login').value != '') { document.getElementById('forum_user_password').focus(); }
    },

    setPos: function(x, y) {
        if (DialogWindow.maxwidth) {
            df5 = DialogWindow.dx - 28;
            df6 = DialogWindow.dy - 28;
            if (x > DialogWindow.maxwidth + df5 || x < DialogWindow.dx) x = null;
            if (y > DialogWindow.maxheight + df6 || y < DialogWindow.dy) y = null;
        }
        var s;
        s = DialogWindow.layer.style;
        if (x) s.left = x - DialogWindow.dx + 'px';
        if (y) s.top = y - DialogWindow.dy + 'px';
    },

    move: function(e) {
        if (!DialogWindow.state)
            return;
        //---
        if (!e) e = window.event;
        //---
        DialogWindow.setPos(e.clientX, e.clientY);
        //---
        if (e.stopPropagation)
            e.stopPropagation();
        else
            e.cancelBubble = true;
    },
    up: function() {
        DialogWindow.state = false;
    },
    down: function(e) {
        if (!e) e = window.event;
        //---
        DialogWindow.state = true;
        //---
        var s;
        DialogWindow.dx = e.clientX - parseInt((s = DialogWindow.layer.style).left);
        DialogWindow.dy = e.clientY - parseInt(s.top);
        //---
        if (e.stopPropagation)
            e.stopPropagation();
        else
            e.cancelBubble = true;
        //---
        return false;
    },
    close: function() {
        DialogWindow.back.style.display = 'none';
        DialogWindow.layer.style.display = 'none';
    }

}
/**
* CENTRAL BOX
*/
var box = {};
//--- move element to the center of screen
box.centralMe = function(id, width, height) {
    var me = document.getElementById(id);
    //---
    var arrayPageSize = this.getPageSize();
    var arrayPageScroll = this.getPageScroll();
    //---
    var boxTop = arrayPageScroll[1] + ((arrayPageSize[3] - height) / 2);
    var boxLeft = ((arrayPageSize[0] - width) / 2);
    //---
    me.style.top = (boxTop < 0) ? "0px" : boxTop + "px";
    me.style.left = (boxLeft < 0) ? "0px" : boxLeft + "px";
    me = null;
}
//--- get pageScroll array
box.getPageScroll = function() {
    var yScroll;
    if (self.pageYOffset) {
        yScroll = self.pageYOffset;
    }
    else
        if (document.documentElement && document.documentElement.scrollTop) {
        yScroll = document.documentElement.scrollTop;
    }
    else
        if (document.body) {
        yScroll = document.body.scrollTop;
    }
    //---
    arrayPageScroll = new Array('', yScroll)
    return arrayPageScroll;
}
//--- get pageSize array
box.getPageSize = function() {
    //---
    var xScroll, yScroll;
    //---
    if (window.innerHeight && window.scrollMaxY) {
        xScroll = document.body.scrollWidth;
        yScroll = window.innerHeight + window.scrollMaxY;
    }
    else
        if (document.body.scrollHeight > document.body.offsetHeight) {
        xScroll = document.body.scrollWidth;
        yScroll = document.body.scrollHeight;
    }
    else {
        xScroll = document.body.offsetWidth;
        yScroll = document.body.offsetHeight;
    }
    var windowWidth, windowHeight;
    if (self.innerHeight) {
        windowWidth = self.innerWidth;
        windowHeight = self.innerHeight;
    }
    else
        if (document.documentElement && document.documentElement.clientHeight) {
        windowWidth = document.documentElement.clientWidth;
        windowHeight = document.documentElement.clientHeight;
    }
    else
        if (document.body) {
        windowWidth = document.body.clientWidth;
        windowHeight = document.body.clientHeight;
    }
    if (yScroll < windowHeight) {
        pageHeight = windowHeight;
    }
    else {
        pageHeight = yScroll;
    }
    if (xScroll < windowWidth) {
        pageWidth = windowWidth;
    }
    else {
        pageWidth = xScroll;
    }
    arrayPageSize = new Array(pageWidth, pageHeight, windowWidth, windowHeight)
    return arrayPageSize;
}
