$(function() {
  Cufon.replace('a, span').CSS.ready(function() {
    var $menu 		= $("#slidingMenu");
    
    /**
    * the first item in the menu, 
    * which is selected by default
    */
    var $selected	= $menu.find('li:first');
    
    /**
    * this is the absolute element,
    * that is going to move across the menu items
    * it has the width of the selected item
    * and the top is the distance from the item to the top
    */
    var $moving		= $('<li />',{
      className	: 'move',
      top			: $selected[0].offsetTop + 'px',
      width		: $selected[0].offsetWidth + 'px'
    });
    
    /**
    * each sliding div (descriptions) will have the same top
    * as the corresponding item in the menu
    */
    $('#slidingMenuDesc > div').each(function(i){
      var $this = $(this);
      $this.css('top',$menu.find('li:nth-child('+parseInt(i+2)+')')[0].offsetTop + 'px');
    });
    
    /**
    * append the absolute div to the menu;
    * when we mouse out from the menu 
    * the absolute div moves to the top (like innitially);
    * when hovering the items of the menu, we move it to its position 
    */
    $menu.bind('mouseleave',function(){
        moveTo($selected,400);
        })
       .append($moving)
       .find('li')
       .not('.move')
       .bind('mouseenter',function(){
        var $this = $(this);
        var offsetLeft = $this.offset().left - 20;
        //slide in the description
        $('#slidingMenuDesc > div:nth-child('+ parseInt($this.index()) +')').stop(true).animate({'width':offsetLeft+'px'},400, 'easeOutExpo');
        //move the absolute div to this item
        moveTo($this,400);
        })
        .bind('mouseleave',function(){
        var $this = $(this);
        var offsetLeft = $this.offset().left - 20;
        //slide out the description
        $('#slidingMenuDesc > div:nth-child('+ parseInt($this.index()) +')').stop(true).animate({'width':'0px'},400, 'easeOutExpo');
        });;
    
    /**
    * moves the absolute div, 
    * with a certain speed, 
    * to the position of $elem
    */
    function moveTo($elem,speed){
      $moving.stop(true).animate({
        top		: $elem[0].offsetTop + 'px',
        width	: $elem[0].offsetWidth + 'px'
      }, speed, 'easeOutExpo');
    }
  }) ;
});

