IZI.menu = {
  relativeParentTop: 0,
  relativeParentLeft: 0,
  menuData: null,
  targetId: 'IZITopmenu',
  visibleMenus: new Array(),
  currentSelection: new Array(),
  timeout: null,
  dataProvider: "/menu",

  init: function ()
  {
    window.addEvent('domready', IZI.menu.loadMenuData );
    window.addEvent('domready', IZI.menu.setOffset );
    window.addEvent('resize', IZI.menu.setOffset );
  },

  setOffset: function ()
  {
    var pos = $(IZI.menu.targetId).getPosition();
    IZI.menu.relativeParentTop = 0-pos.y;
    IZI.menu.relativeParentLeft = 0-pos.x - 2;
  },

  handleSubMenu: function ( menuItem )
  {
    clearTimeout( IZI.menu.timeout );

    var child = menuItem.getElement( 'ul' );
    if ( !child ) {
      this.currentSelection = menuItem;
      this.hideOtherMenus();
      return;
    }
    var rootItem = menuItem.getParent().getParent().id == this.targetId;

    var parentCoord = menuItem.getElement('a').getCoordinates();
    parentCoord.height += IZI.menu.relativeParentTop;
    parentCoord.left += IZI.menu.relativeParentLeft;
    child.setStyle( 'position', 'absolute' );
    if ( rootItem ) {
      child.setStyle( 'top', parentCoord.top + parentCoord.height );
      child.setStyle( 'left', parentCoord.left );
    } else {
      child.setStyle( 'margin-top', 0 - parentCoord.height );
      child.setStyle( 'left', parentCoord.width );
    }

    this.showItem( child );
    this.currentSelection = child;
    this.visibleMenus.push( child );
    this.hideOtherMenus();
  },

  hideOtherMenus: function ()
  {
    var selectionTree = new Array();
    var current = this.currentSelection;
      if ( current ) {
      while( current.id != this.targetId ) {
        selectionTree.push( current );
        current = current.getParent();
      }
    }
    $(this.targetId).getElements( 'a.selected' ).each( function ( element ) {
       element.removeClass( 'selected' );
    } );
    selectionTree.each( function ( element ) {
      if ( element.getTag() == 'li' && element != IZI.menu.currentSelection ) {
        element.getElement( 'a' ).addClass( 'selected' );
      }
    } );
    var items = this.visibleMenus;
    for( var i = 0 ; i < items.length ; i++ ) {
      if( !selectionTree.contains( items[i] ) ) {
        this.hideItem( items[i] );
      }
    }
    selectionTree = null;
  },

  handleMouseOut: function ( menuItem )
  {
    IZI.menu.timeout = setTimeout( function (){
      IZI.menu.currentSelection = null;
      IZI.menu.hideOtherMenus();
      IZI.menu.visibleMenus = new Array();
    }, 1000 );
  },

  showItem: function ( item )
  {
    item.fx = new Fx.Styles( item, {duration: 300,transition: Fx.Transitions.Sine.easeInOut});
    if ( item.getStyle( 'visibility' ) == 'hidden' )
      item.fx.start({'opacity': [0, 1]});
  },

  hideItem: function ( item )
  {
    item.fx.stop();
    item.setStyle( 'visibility', 'hidden' );
  },

  drawMenu: function ()
  {
    var container = $(this.targetId);
    var root = new Element('ul');
    var items = this.menuData.menuItems;
    for ( var i = 0 ; i < items.length ; i++ ) {
      var item = this.drawItem( items[i], "menu" + i);
      var a = item.getElement( 'a' );
      var name = a.getText();
      a.setText( name );
      root.appendChild( item );
    }

    container.appendChild( root );
  },

  drawItem: function ( item, className )
  {
    var li = new Element('li');

    li.addClass( className );
    if( item.styleName ) li.addClass( item.styleName );
    if ( item.children.length > 0 ) li.addClass( 'hassub' );

    li.appendChild( this.drawLink( item, li, className ) );
    if ( item.icon ) {
      li.setStyle( 'background-image', 'url('+ item.icon +')' );
    }

    if ( item.children.length > 0 ) {
      var ul = new Element('ul');
      ul.addClass( className );
      for ( var i = 0 ; i < item.children.length ; i++ ) {
        if ( i == item.children.length -1 ) {
          className += ' lastItem';
        }
        ul.appendChild( this.drawItem( item.children[i], className ) );
      }
      li.appendChild( ul );
    }
    return li;
  },

  drawLink: function ( item, parentElement )
  {
    var a = new Element('a', {
      'href': item.href,
      'events': {
        'mouseover': function()  { IZI.menu.handleSubMenu( parentElement ); },
        'mouseleave': function() { IZI.menu.handleMouseOut( parentElement ); }
      }
    });
    if ( item.onclick ) {
      a.addEvent( 'click', function( event ) {
        eval( item.onclick );
        new Event(event).preventDefault();
      } );
    }
    if ( item.children.length > 0 ) {
      a.addClass( 'hasSubmenu' );
    }
    a.setHTML( item.text );
    return a;
  },

  loadMenuData: function ()
  {
    var url = IZI.menu.dataProvider;
    var jSonRequest = new Json.Remote(url, {onComplete: function( result ) {
      var data = IZI.Ajax.parseResponse(result);
      if ( result.success ) {
        IZI.menu.menuData = result.data;
        IZI.menu.drawMenu();
      }
    }}).send();
  },

  reloadMenu: function ()
  {
    this.currentSelection = null;
    this.hideOtherMenus();
    this.visibleMenus = new Array();
    $(IZI.menu.targetId).empty();
    this.loadMenuData();
  }
}

