
  // ----------------------------------- //
  //  DropDown Menu by Slava Fomin II.   //
  //  (c) Groteck: http://groteck.ru/    //
  //  Version: 1.0.2 BETA.               //
  // ----------------------------------- //
  
  // Объект меню (в статическом стиле).
  ddMenu = new Object();
  
  // Список дескрипторов меню.
  ddMenu.menus = new Array();
  
  // Эффект прорисовки списков.
  ddMenu.effect = 'default';

  // Время через которое список закрывается сам.  
  ddMenu.fold_delay = 1500; // 1.5 seconds.
  
  // Скорость сворачивания и разворачивания.
  ddMenu.fold_speed = 200;
  
  // Базовое смещение списка меню по вертикальной оси.  
  ddMenu.offset_y = 8;
  
  // Моментальное сворачивание списка.
  ddMenu.fast_fold = false;
  
  // *****
  
  // Функция для добавления нового меню.
  // menu_id - идентификатор меню,
  // items_count - количество списков в меню.
  // settings - объект параметров.
  //   fold_delay - время через которое список закрывается сам [int] (в мс).
  //   fold_speed - скорость сворачивания и разворачивания [int] (в мс).
  //   effect     - эффект прорисовки списка ([str]: default, fade, slide).
  //   offset_y   - Базовое смещение списка меню по вертикальной оси [int] px.
  //   fast_fold  - моментальное сворачивание списка.
  //
  // ----------
  
  ddMenu.createMenu = function(menu_id, items_count, settings)
  {
    // Объект дескрипора меню.
    var oMenu = new Object();
    
    // Идентификатор меню.
    oMenu.id = menu_id;
    
    // Количество списков в меню.
    oMenu.items_count = items_count;
    
    // Идентификатор открытого списка.
    oMenu.item_id = null;
    
    // Указатель на таймер сворачивания.
    oMenu.timer = null;
    
    // Применяем дополнительные настройки.
    // -----
    
    var effect     = ddMenu.effect;
    var fold_delay = ddMenu.fold_delay;
    var fold_speed = ddMenu.fold_speed;
    var offset_y   = ddMenu.offset_y;
    var fast_fold  = ddMenu.fast_fold;
    
    if(settings)
    {
      if(settings.effect)
        effect = settings.effect;
        
      if(settings.fold_delay)
        fold_delay = settings.fold_delay;
        
      if(settings.fold_speed)
        fold_speed = settings.fold_speed;
        
      if(settings.offset_y)
        offset_y = settings.offset_y;
        
      if(settings.fast_fold)
        fast_fold = settings.fast_fold;
      
    }
    
    oMenu.effect     = effect;
    oMenu.fold_delay = fold_delay;
    oMenu.fold_speed = fold_speed;
    oMenu.offset_y   = offset_y;
    oMenu.fast_fold  = fast_fold;
    
    // Добавляем дескриптор в список.    
    this.menus.push(oMenu);
    
  };
  
  // Инициализация всех создаваемых меню.
  // Цепляем обработчики событий.
  // ----------
  
  ddMenu.initMenus = function ()
  {
    jQuery.each(this.menus,
      function (key, oMenu)
      {
        for(var i = 1; i <= oMenu.items_count; i++)
        {
          var item_id = oMenu.id + '_i' + i;
          
          var objDomMenu = $('#' + item_id);
          
          objDomMenu.bind('mouseover', '{"menus_key":"' + key + '", "item_id":"' + i + '"}', ddMenu.over);
          objDomMenu.bind('mouseout',  '{"menus_key":"' + key + '"}', ddMenu.out);
          
          var objDomMenuItem = $('#' + item_id + '_menu');
          
          objDomMenuItem.bind('mouseover', '{"menus_key":"' + key + '"}', ddMenu.menuItemOver);
          objDomMenuItem.bind('mouseout', '{"menus_key":"' + key + '"}', ddMenu.out);
          
          /*
          
          objDomMenuItem.css(
            {
              'position':'absolute',
              'left': objDomMenu.offset().left-168 + 'px',
              'top': objDomMenu.offset().top + objDomMenu.height() + oMenu.offset_y + 1 + 'px'
            }
          );
          
          */
          
        }
        
      }
      
    );
    
  };
  
  // Обработчик наведения на пункт меню.
  // ----------
  
  ddMenu.over = function (event)
  {
    var data = eval('(' + event.data + ')');
    
    var oMenu = ddMenu.menus[data.menus_key];
    
    // Если какой-то список в этом меню
    // готовится к закрытию - отменяем.
    // -----
    
    if(oMenu.timer)
      clearTimeout(oMenu.timer);
      
    // Если уже открыт другой список - закрываем его.
    // -----
    
    var item_id = oMenu.id + '_i' + data.item_id + '_menu';
    
    if(oMenu.item_id)
    {
      if(oMenu.item_id != item_id)
        ddMenu.doFold(data.menus_key);
        
      else
        return true;
      
    }
    
    // Подсвечиваем кнопочку.
    // -----
    
    var button_id = oMenu.id + '_i' + data.item_id;
    $('#' + button_id).addClass('selected');
    
    // Обновляем дескриптор меню,
    // отображаем список.
    // -----

    oMenu.item_id = item_id;
    
    if(oMenu.effect == 'fade')
      $('#' + item_id).fadeIn(oMenu.fold_speed);
      
    else if(oMenu.effect == 'slide')
      $('#' + item_id).slideDown(oMenu.fold_speed);
      
    else
      $('#' + item_id).show(oMenu.fold_speed);
      
    return true;
    
  };
  
  // Обработчик ухода.
  // ----------  
  
  ddMenu.out = function (event)
  {
    var data = eval('(' + event.data + ')');
    
    var oMenu = ddMenu.menus[data.menus_key];
    
    // Ставим этот список на закрытие через таймер.
    // -----
    
    var cmd = "ddMenu.doFold('" + data.menus_key + "');";
    
    oMenu.timer = setTimeout(cmd, oMenu.fold_delay);
    
  };
  
  // Сворачивание списка.
  // ----------
  
  ddMenu.doFold = function (menus_key)
  {
    var oMenu = ddMenu.menus[menus_key];
    
    if(oMenu.item_id)
    {
      var fold_speed = oMenu.fold_speed;
      
      if(oMenu.fast_fold)
        fold_speed = 0;
      
      if(oMenu.effect == 'fade')
        $('#' + oMenu.item_id).fadeOut(fold_speed);
        
      else if(oMenu.effect == 'slide')
        $('#' + oMenu.item_id).slideUp(fold_speed);
        
      else
        $('#' + oMenu.item_id).hide(fold_speed);
        
    }
    
    $('#' + oMenu.id).find('.selected').removeClass('selected');
    
    // Обнуляем дескриптор меню.
    // -----
      
    oMenu.item_id = null;
    oMenu.timer   = null;
    
  };
  
  // Обработчик наведения на список.
  // ----------  
  
  ddMenu.menuItemOver = function (event)
  {
    var data = eval('(' + event.data + ')');
    
    var oMenu = ddMenu.menus[data.menus_key];
    
    // Если список готовится закрыться - отменяем.
    // -----
    
    if(oMenu.timer)
      clearTimeout(oMenu.timer);    
    
  };
  
  
  
  
  