/**
 * mooMenuPreview - A menu that gives a preview of its children
 * The menu must be constructed using a list
 *
 * When the user hovers a menu item, a preview of the underlying child items is displayed for a given amount of seconds
 *
 * version 0.2
 * copyright 2009 08 06 - Huug Helmink
 */
var mooMenuPreview = new Class({
  Implements: Options,
  options: {
    liWithChildrenClass: 'AspNet-Menu-WithChildren',
    liChildSelectedClass: 'AspNet-Menu-ChildSelected',
    MenuSelectedClass: 'AspNet-Menu-Selected',
    hideDelay: 2500
  },
  
  initialize: function(MenuContainer,options) {
    // Set options
    this.setOptions(options);
    this.liWithChildrenClass = this.options.liWithChildrenClass;
    this.liChildSelectedClass = this.options.liChildSelectedClass;
    this.MenuSelectedClass = this.options.MenuSelectedClass;
    this.hideDelay = this.options.hideDelay;
    this.timer = $empty;
    
    // Get all menu leafs
    var menuWithChildren = $(MenuContainer).getElements('li.' + this.liWithChildrenClass);
    this.activeLeaf = $(MenuContainer).getElement('li.' + this.MenuSelectedClass);
    if(this.activeLeaf) this.isChild = this.isChildMenu(this.activeLeaf);
    if(this.isChild) this.Parent = $(MenuContainer).getElement('li.' + this.liChildSelectedClass);

    // Add mousover event on menu's with children
    menuWithChildren.each(function(li) {
      li.addEvents({
        'mouseover': function() {
          this.timer = $clear(this.timer);
          // Hide other subs
          if(this.tmpActiveLeaf) this.tmpActiveLeaf.removeClass(this.MenuSelectedClass);
          // Set tmpLeaf
          this.tmpActiveLeaf = li;
          
          this.displaySub();
        }.bind(this),
        'mouseout': function() {
          this.timer = this.hideSub.delay(this.hideDelay,this);
        }.bind(this)
      });
    }.bind(this));
  },
  
  // Display a submenu
  displaySub: function() {
    if(this.activeLear) {
      this.activeLeaf.removeClass(this.MenuSelectedClass);
      this.activeLeaf.getElement('a').removeClass(this.MenuSelectedClass);
    }
    if(this.Parent) this.Parent.removeClass(this.liChildSelectedClass);
    
    this.tmpActiveLeaf.addClass(this.MenuSelectedClass);
  },
  
  // Hide a submenu
  hideSub: function() {
    this.tmpActiveLeaf.getElement('ul').get('tween',{property:'opacity', onComplete:function(item) {
      this.tmpActiveLeaf.removeClass(this.MenuSelectedClass);

      if(this.Parent) this.Parent.addClass(this.liChildSelectedClass);
      if(this.activeLeaf) {
        this.activeLeaf.addClass(this.MenuSelectedClass);
        this.activeLeaf.getElement('a').addClass(this.MenuSelectedClass);
      }
      
      item.get('tween',{property:'opacity'}).start(1);
    }.bind(this)}).start(1,0);    
  },
  
  isChildMenu: function(leaf) {
    return leaf.getParent().getParent().hasClass(this.liChildSelectedClass);
  }
});
