var slider_menu = {
  slider: null,
  selected_tab: null, //tab that is currently being brought in, faded out, or visible
  pending_tab: null, //tab that is supposed to be brought in next
  active_tab: null,
  position_x1: 0,
  position_x2: 0,
  interval_id: null,
  show_delay: 50,
  show_speed: 200,
  hide_delay: 50,
  hide_speed: 200,
  current_state: "NoSelectedItem",
  //all states: NoSelectedItem, TabWaitToShow, ShowTabAnim, ActiveTabVisible, ShowTabAnimWaitToHide,
  //ShowTabAnimWaitToHideAndShowOtherTab, ActiveTabVisibleWaitToHide, HideTabAnim, HideTabAnimWaitToShow
  
  //state transitions:
  // NoSelectedItem : MouseEnter Tab -> TabWaitToShow (set selected_tab)
  //
  // TabWaitToShow : Delay Expires -> ShowTabAnim
  //                 MouseLeave Tab -> NoSelectedItem (clear selected_tab)
  //
  // ShowTabAnim : Anim Complete -> ActiveTabVisible
  //              MouseLeave Tab -> ShowTabAnimWaitToHide
  //              
  // ActiveTabVisible : MouseLeave Tab -> ActiveTabVisibleWaitToHide
  //      
  // ShowTabAnimWaitToHide : Anim Complete -> HideTabAnim
  //                        MouseEnter Same or Active Tab -> ShowTabAnim
  //                        MouseEnter Other Tab -> ShowTabAnimWaitToHideAndShowOtherTab (set pending_tab)
  //
  // ShowTabAnimWaitToHideAndShowOtherTab : Anim Complete -> HideTabAnimWaitToShow
  //                                       MouseEnter Same or Active Tab -> ShowTabAnim
  //                                       MouseEnter Other Tab -> Same (set pending_tab)
  //                                       MouseLeave Tab -> ShowTabAnimWaitToHide (clear pending_tab)
  //
  // ActiveTabVisibleWaitToHide : Delay Expires -> HideTabAnim
  //                             MouseEnter Same or Active Tab -> ActiveTabVisible
  //                             MouseEnter Other Tab -> HideTabAnimWaitToShow (set pending_tab)
  //                             
  // HideTabAnim : Anim Complete -> NoSelectedItem (clear selected_tab)
  //              MouseEnter Tab -> HideTabAnimWaitToShow (set pending_tab)
  //
  // HideTabAdminWaitToShow : Anim Complete -> ShowTabAdmin (copy pending_tab -> selected_tab, clear pending_tab)
  //                         MouseLeaveTab -> HideTabAnim (clear pending_tab)               
  init: function() {
    var old_slider = $('#slider');
    old_slider.hide();

    var sid = old_slider.attr('id');
    old_slider.removeAttr('id');
    
    var slider_links = old_slider.children('li');
    
    var new_slider = $('<div class="slider-container" />');
    new_slider.attr('id', sid);
    new_slider.insertAfter(old_slider);
    new_slider.css( {position: "relative", height: 225, zIndex: 1000 } );
    
    for (var i=0; i<slider_links.size(); i++) {
      var new_image = $('<div class="slider-tab" />');
      if (i) {
        new_image.css({ float: "left", position: "relative", width: 137, height: 225, overflow: "hidden" });
      } else {
        new_image.css({ float: "left", position: "relative", width: 138, height: 225, overflow: "hidden" });
      }
      new_image.appendTo(new_slider);
      new_image.html(slider_links.eq(i).html());
      if (i>0) { $('<img class="menu-tab-shadow" src="/templates/hague2010/images/tab_shadow.png" alt="" />').appendTo($('a', new_image)).css({ position: "absolute", left: 0, top: 0 }); }
      
      new_image.data('ident', 'tab'+i);
      new_image.mouseenter(slider_menu.slider_tab_enter);
      new_image.mouseleave(slider_menu.slider_tab_leave);
    }

    slider_menu.active_tab = $('<div class="slider-active-tab" />').appendTo(new_slider).hide();
    slider_menu.active_tab.css({ position: "absolute", overflow: "hidden" });
    old_slider.remove();
    slider_menu.active_tab.mouseenter(slider_menu.active_tab_enter);
    slider_menu.active_tab.mouseleave(slider_menu.active_tab_leave);
  },
slider_tab_enter: function() {
  slider_menu.Log('**** slider_tab_enter()');

  var thistab = $(this);
  var sametab = false;
  
  if (slider_menu.selected_tab && slider_menu.selected_tab.data('ident') == thistab.data('ident')) { sametab = true; }        
  slider_menu.position_x1 = thistab.position().left;
  slider_menu.position_x2 = thistab.position().left / 823 * 640;
  if (slider_menu.position_x1 == slider_menu.position_x2) { slider_menu.position_x2+=16; }

  switch(slider_menu.current_state) {
    case "NoSelectedItem":
      slider_menu.selected_tab = thistab;
      slider_menu.interval_id = window.setTimeout(slider_menu.slider_timer_expired, slider_menu.show_delay);
      slider_menu.EnterState("TabWaitToShow");
      break;
    case "ShowTabAnimWaitToHide":
    case "ShowTabAnimWaitToHideAndShowOtherTab":
      if (slider_menu.interval_id) { window.clearTimeout(slider_menu.interval_id); slider_menu.interval_id = null; }
      if ( sametab ) {
        slider_menu.EnterState("ShowTabAnim");
      } else {
        slider_menu.selected_tab = thistab;
        slider_menu.EnterState("ShowTabAnimWaitToHideAndShowOtherTab");
      }
      break;
    case "ActiveTabVisibleWaitToHide":
      if (slider_menu.interval_id) { window.clearTimeout(slider_menu.interval_id); slider_menu.interval_id = null; }
      if ( sametab ) {
        slider_menu.EnterState("ActiveTabVisible");
      } else {
        slider_menu.selected_tab = thistab;
        slider_menu.do_hide_anim();
        slider_menu.EnterState("HideTabAnimWaitToShow");
      }
      break;
    case "HideTabAnim":
      if (slider_menu.interval_id) { window.clearTimeout(slider_menu.interval_id); slider_menu.interval_id = null; }
      slider_menu.selected_tab = thistab;
      slider_menu.EnterState("HideTabAnimWaitToShow");
      break;
  }
  },
slider_tab_leave: function() {
  slider_menu.Log('**** slider_tab_leave()');

  switch(slider_menu.current_state) {
    case "TabWaitToShow":
      slider_menu.selected_tab = null;
      if (slider_menu.interval_id) { window.clearTimeout(slider_menu.interval_id); slider_menu.interval_id = null; }
      slider_menu.EnterState("NoSelectedItem");
      break;
    case "ShowTabAnim":
      if (slider_menu.interval_id) { window.clearTimeout(slider_menu.interval_id); slider_menu.interval_id = null; }
      slider_menu.EnterState("ShowTabAnimWaitToHide");
      break;
    case "ActiveTabVisible":
      slider_menu.interval_id = window.setTimeout(slider_menu.slider_timer_expired, slider_menu.hide_delay);
      slider_menu.EnterState("ActiveTabVisibleWaitToHide");
      break;
    case "ShowTabAnimWaitToHideAndShowOtherTab":
      if (slider_menu.interval_id) { window.clearTimeout(slider_menu.interval_id); slider_menu.interval_id = null; }
      slider_menu.EnterState("ShowTabAnimWaitToHide");
      break;
    case "HideTabAnimWaitToShow":
      slider_menu.selected_tab = null;
      slider_menu.EnterState("HideTabAnim");
      break;
  }
  },
slider_timer_expired: function() {
  slider_menu.Log('**** slider_timer_expired()');

  switch(slider_menu.current_state) {
    case "TabWaitToShow":
      if (slider_menu.interval_id) { window.clearTimeout(slider_menu.interval_id); slider_menu.interval_id = null; }
      slider_menu.active_tab.hide();
      slider_menu.do_display_anim();
      slider_menu.EnterState("ShowTabAnim");
      break;
    case "ActiveTabVisibleWaitToHide":
      if (slider_menu.interval_id) { window.clearTimeout(slider_menu.interval_id); slider_menu.interval_id = null; }
      slider_menu.do_hide_anim();
      slider_menu.EnterState("HideTabAnim");
      break;
  }      
},
slider_anim_complete: function() {
  slider_menu.Log('**** slider_anim_complete()');

  slider_menu.active_tab.removeClass('iecomp');

  switch(slider_menu.current_state) {
    case "ShowTabAnim":
      slider_menu.EnterState("ActiveTabVisible");
      break;      
    case "ShowTabAnimWaitToHide":
      slider_menu.selected_tab = null;
      slider_menu.do_hide_anim();
      slider_menu.EnterState("HideTabAnim");
      break;
    case "ShowTabAnimWaitToHideAndShowOtherTab":
      slider_menu.do_hide_anim();
      slider_menu.EnterState("HideTabAnimWaitToShow");
      break;
    case "HideTabAnim":
      slider_menu.active_tab.hide();
      slider_menu.selected_tab = null;
      slider_menu.EnterState("NoSelectedItem");
      break;
    case "HideTabAnimWaitToShow":
      slider_menu.active_tab.hide();
      slider_menu.do_display_anim();
      slider_menu.EnterState("ShowTabAnim");
      break;
  }
},
active_tab_enter: function() {
  slider_menu.Log('**** active_tab_enter() ' + slider_menu.current_state);

  switch(slider_menu.current_state) {
    case "ShowTabAnimWaitToHide":
    case "ShowTabAnimWaitToHideAndShowOtherTab":
      slider_menu.EnterState("ShowTabAnim");
      break;
    case "ActiveTabVisibleWaitToHide":
      slider_menu.EnterState("ActiveTabVisible");
      break;
  }
  },
active_tab_leave: function() {
  slider_menu.Log('**** active_tab_leave()');

  switch(slider_menu.current_state) {
    case "TabWaitToShow":
      slider_menu.selected_tab = null;
      if (slider_menu.interval_id) { window.clearTimeout(slider_menu.interval_id); slider_menu.interval_id = null; }
      slider_menu.EnterState("NoSelectedItem");
      break;
    case "ShowTabAnim":
      slider_menu.EnterState("ShowTabAnimWaitToHide");
      break;
    case "ActiveTabVisible":
      slider_menu.interval_id = window.setTimeout(slider_menu.slider_timer_expired, slider_menu.hide_delay);
      slider_menu.EnterState("ActiveTabVisibleWaitToHide");
      break;
    case "ShowTabAnimWaitToHideAndShowOtherTab":
      slider_menu.EnterState("ShowTabAnimWaitToHide");
      break;
    case "HideTabAnimWaitToShow":
      slider_menu.selected_tab = null;
      slider_menu.EnterState("HideTabAnim");
      break;
  }
},
do_display_anim: function() {
  slider_menu.Log('do_display_anim');

  if ($.browser.msie) { slider_menu.active_tab.addClass('iecomp');  }
  
  slider_menu.active_tab.css({ width: slider_menu.selected_tab.width(), top: 0, left: slider_menu.position_x1, opacity: 0, height: 225 });
  $('ul', slider_menu.active_tab).hide();
  slider_menu.active_tab.html(slider_menu.selected_tab.html());
  $('.menu-tab-shadow', slider_menu.active_tab).hide();
  $('a:eq(0)', slider_menu.active_tab).attr('title', $('span:eq(0)', slider_menu.active_tab).text());
  $('img', slider_menu.active_tab).animate({ marginLeft: 0}, slider_menu.show_speed);
  slider_menu.active_tab.animate({ top: 24, width: 320, height: 240, opacity: 1, left: slider_menu.position_x2 }, slider_menu.show_speed, null, 
    function () {
      slider_menu.active_tab.css({ opacity: ''});
      slider_menu.active_tab.removeClass('iecomp');
/*
      if ($('ul', slider_menu.active_tab).size() == 0) {
        slider_menu.slider_anim_complete();
        return;
      }
      $('ul', slider_menu.active_tab).css({height: 0}).show();
      $('ul', slider_menu.active_tab).animate({ height: 240}, slider_menu.show_speed, null, slider_menu.slider_anim_complete);
*/
      slider_menu.slider_anim_complete();
    }
  );
},
do_hide_anim: function() {
  slider_menu.Log('do_hide_anim');
  if ($.browser.msie) { slider_menu.active_tab.addClass('iecomp');  }
  slider_menu.active_tab.animate({opacity: 0, top: "+=32"}, slider_menu.hide_speed, null, slider_menu.slider_anim_complete);
},
Log: function(message) {
  /*
  while ($('#log p').size() > 14) {
    $('#log p:first-child').remove();
  }
  */
  //$('<p />').appendTo($('#log')).text(message);
},
EnterState: function(new_state) {
    slider_menu.Log('State Change: ' + slider_menu.current_state + ' -> ' + new_state);
    slider_menu.current_state = new_state;
  }
}
$(window).bind('load', function() {
  slider_menu.init();
});


