  function get_visits_table() {
          visits_by_days=$('visits_by_days').value||0;
          period_from=$('period_from').value||'';
          period_to=$('period_to').value||'';
          sort_by=$('sort_by').value||0;
          var ajax_obj= new Ajax.Updater('visits_table', './small_content/ajax/visits.php?days='+visits_by_days+'&period_from='+period_from+'&period_to='+period_to+'&sort_by='+sort_by);
  }

  function set_page_visit(page) {
          page=page||'index';
          var ajax_obj= new Ajax.Request('./small_content/ajax/page_visits.php?page='+page,{method:'get'});
  }

   /*
   * Функция обращается к серверу и получает данные в формате XML.
   * Полученный XML парсится и загружается список SELECT.
   * Для обращения к серверу и получения возвращаемых значений
   * используется библиотека Prototype.js
   * Вид принимаемого XML <root><option value="..."/>...</option></root> *
  */
  function select_load(url,el_id,init_value,param) {
           /*
            * Проверка на пустору параметров для URL
           */
           param = param || '';
           init_value = init_value || '';

           /*
            * Очистка списка
           */
           del_sel_options(el_id);

           $(el_id).options[0] = new Option('Loading...', '', false, false);
           $(el_id).disabled=true;

           /*
            * Посылка запроса на сервер и обработка ответа
           */
           var obj_p = new Ajax.Request('./small_content/ajax/'+url+param,
               {method:'get',
               onSuccess: function(response){
                var text, val;
                /*
                 * парсинг возвращенного текста как XML
                */
                ajaxResponse=getXmlFromResponse(response);

                /*
                 * добавление строк в список
                */
                $(el_id).options[0] = new Option('', '', false, false);
                var count = ajaxResponse.documentElement.childNodes.length;
                var opt = ajaxResponse.documentElement.childNodes;
                var is_select=false;
                for(i=0;i<count;i++) {
                /*
                 * Не пустой ли элемент
                */
                 if(opt[i].childNodes.length>0) {
                  text = opt[i].childNodes[0].nodeValue;
                  val = opt[i].attributes[0].nodeValue;
                 }
                 else {
                  text = "";
                  val = "";
                 }
                  if(val==init_value) {is_select=true;}
                  else {is_select=false;}
                  $(el_id).options[i] = new Option(text, val, false, is_select);
                }
                $(el_id).disabled=false;
                },

                onFailure: function(){
                  $(el_id).options[0] = new Option('', '', false, false);
                  $(el_id).disabled=false;
                }
           });
  }

  /*
   * Функция поиска. Строка для поиска передается серверу, ответ парсится
   * и загружается в список.
   * Для обращения к серверу и получения возвращаемых значений
   * используется библиотека Prototype.js
   * Вид принимаемого XML <root><optgroup label="..."><option value="..."/>...</option></optgroup></root> *
  */
  function search_in_select(url,el_id,param,init_value) {
           /*
            * Проверка на пустору параметров для URL
           */
           param = param || '';

           /*
            * Очистка списка
           */
           del_sel_options(el_id);

           $(el_id).options[0] = new Option('Loading...', '', false, false);
           $(el_id).disabled=true;

           /*
            * Посылка запроса на сервер и обработка ответа
           */
           var obj_p = new Ajax.Request("./small_content/ajax/"+url+param,
               {method:'get',
               onSuccess: function(response){
                var text, val, group_text;
                /*
                 * парсинг возвращенного текста как XML
                */
                ajaxResponse=getXmlFromResponse(response);

                /*
                 * добавление строк в список
                */
                $(el_id).options[0] = new Option('', '', false, false);
                var count = ajaxResponse.documentElement.childNodes.length;
                var opt = ajaxResponse.documentElement.childNodes;
                var is_select=false;
                for(i=0;i<count;i++) {
                 /*
                  * Не пустой ли элемент
                 */
                  if(opt[i].childNodes.length>0) {
                    text = opt[i].childNodes[0].nodeValue;
                    val = opt[i].attributes[0].nodeValue;
                  }
                  else {
                    text = "";
                    val = "";
                  }

                  if(val==init_value) {is_select=true;}
                  else {is_select=false;}
                  $(el_id).options[i] = new Option(text, val, false, is_select);
                }
                $(el_id).disabled=false;
                },

                onFailure: function(){
                  $(el_id).options[0] = new Option('', '', false, false);
                  $(el_id).disabled=false;
                }
           });
  }

  /*
   * Возвращает таблицу курсов.
  */
  function get_course_table() {
           cur_from=$F('cur_from')||"";
           cur_to=$F('cur_to')||"";
           is_calculate=$F('is_calculate')||0;
           min_balance=$F('min_balance')||0;
           sort_by=$F('sort_by')||2;
           var obj_p = new Ajax.Updater('cur_table', './small_content/ajax/course_table.php?cur_from='+cur_from+'&cur_to='+cur_to+'&is_calculate='+is_calculate+'&min_balance='+min_balance+'&sort_by='+sort_by,{method: 'get'});
  }

  var obj_auto;
  /*
   * Запускает или останавливает переодический апдейт таблицы курсов.
  */
  function autho_update_course_table() {
           if($('is_autoupdate').checked==true) {
              cur_from=$F('cur_from')||"";
              cur_to=$F('cur_to')||"";
              is_calculate=$F('is_calculate')||0;
              min_balance=$F('min_balance')||0;
              sort_by=$F('sort_by')||2;

              obj_auto = new Ajax.PeriodicalUpdater('cur_table', './small_content/ajax/course_table.php?cur_from='+cur_from+'&cur_to='+cur_to+'&is_calculate='+is_calculate+'&min_balance='+min_balance+'&sort_by='+sort_by, {method: 'get', frequency: 180});
           }
           else {
              obj_auto.stop();
           }
  }

  /*
   * Останавливает автоопдейт таблицы курсов.
  */
  function stop_update_course_table() {
           if(obj_auto) {
              obj_auto.stop();
              $('is_autoupdate').checked=false;
           }
  }

  /*
   * Функция очищает список.
  */
  function del_sel_options(el_id) {
    while($(el_id).firstChild) {
      $(el_id).removeChild($(el_id).firstChild);
    }
  }

  /*
   * Функция инициализирует все списки на странице
   * у которых есть событие onBlur
  */
  function init_selects2() {
    $A($$('select')).each(function(select) {
     if(select.onblur){
      select.onblur();
      select.onblur = function() {}
     }
    });
  }

  /*
   * Функция возвращает распарсеный XML
   * @return object
  */
  function getXmlFromResponse(response) {
           if(response.responseXml!=null) {
                 var ajaxResponse=response.responseXml;
           }
           else {
                 var ajaxResponse = Try.these(
                  function() { return new DOMParser().parseFromString(response.responseText,'text/xml'); },
                  function() { var xmldom = new ActiveXObject('Microsoft.XMLDOM');
                                   xmldom.loadXML(response.responseText); return xmldom; }
                 );
           }
           return ajaxResponse;
  }
