Menu = {
   _cache:{},
   _to:{},
   _active:null,
   
   getLeftPos:function ( element ) {
      var ptr = element;
      var i = 0;
      do {
         if ( typeof ( ptr.offsetLeft ) != 'undefined' ) {
            i += ptr.offsetLeft;
         }
         ptr = ptr.parentNode;
      } while ( ptr.tagName.toLowerCase () != 'table' );
      return i;
   },
   
   getTopPos:function ( element ) {
      if ( 
         typeof(element.offsetHeight) != 'undefined'
      && typeof(element.offsetTop) != 'undefined'
      ) {
         return element [ 'offsetHeight' ] + element [ 'offsetTop' ];
      }
   },
   
   enter:function ( name, obj ) {
      if ( Menu._active != null ) {
         Menu.off( Menu._active );
      }
      Menu.clearTo ( name );
      var subObj = Menu.sub(name);
      if ( subObj != null ) {
         if ( obj != null ) {
            subObj.style.left = Menu.getLeftPos ( obj ) + 'px';
            subObj.style.top = Menu.getTopPos ( obj.parentNode ) + 'px';
         }
         Menu.parent(name).className = 'over';
         subObj.className = subObj.className.replace ( 'out', 'over' );
         Menu._active = name;
      }
   },
   
   exit:function ( name ) {
      Menu.clearTo( name );
      Menu.setTo ( name );
   },
   
   clearTo:function ( name ) {
      if ( typeof(Menu._to[name]) != 'undefined' && Menu._to[name] != null ) {
         clearTimeout ( Menu._to[name] );
         Menu._to[name] = null;
      }
   },
   
   setTo:function ( name ) {
      Menu._to[name]=setTimeout ( 'Menu.off(\'' + name + '\');', 1400 );
   },
   
   off:function ( name ) {
      if ( name ) {
         var subObj = Menu.sub(name);
         if ( subObj != null ) {
            Menu._active = null;
            Menu.clearTo(name);
            Menu.parent(name).className = '';
            subObj.className = subObj.className.replace ( 'over', 'out' );
         }
      }
   },
   
   sub:function ( id ) {
      if ( typeof(Menu._cache[id]) == 'undefined' ) {
         Menu._cache [id] = document.getElementById ( 'sub' + id );
         if ( !Menu._cache [id] ) {
            Menu._cache[id] = null;
         }
      }
      return Menu._cache[id];
   },
   
   parent:function ( id ) {
      var pId = 'parent_' + id;
      if ( typeof(Menu [pId]) == 'undefined' ) {
         Menu._cache [pId] = document.getElementById ( pId );
      }
      return Menu._cache [ pId ];
   }
}

