/**
 * @filename garminNavBar.js 
 * @description Handles events for Garmin nav bar 
 * @author Diana Chow, diana.chow at garmin.com
 * @requires Prototype 1.6.0.3+
 * Copyright(c) 2009, Garmin International
 */
if(Garmin == undefined) var Garmin = {};
/**
 * GarminNavBarConstants provides id's and classes used by the Garmin.NavBar object.
 */
var GarminNavBarConstants = {
    // Mapping of tab ids and sub tab menu ids
    TAB_MENU_MAP: {
        'navBarTabLearn': 'subTabLearn',
        'navBarTabMyConnect': 'subTabMyConnect',
        'navBarTabExplore': 'subTabExplore'
    },
    TABS_WRAPPER_ID: 'navBarTabsWrapper',
    // Class
    SELECTED_CLASS: 'navTabSelected'
};
Garmin.NavBar = Class.create({
    initialize: function() {
        this.defaultTabId = this.selectedTabId = this.detectSelectedTab();
       	this.setEventHandlers();
    },
    detectSelectedTab: function() {        
        for ( var tabId in GarminNavBarConstants.TAB_MENU_MAP ) {
            var tabElement = $(tabId);
            if( tabElement != null && typeof(tabElement.hasClassName) != 'undefined' && tabElement.hasClassName(GarminNavBarConstants.SELECTED_CLASS)) {
                return tabId;
            }
        }
        return null;
    },
    _highlightTab: function(highlightTabId) {
        // Unselect current tab
        for ( var tabId in GarminNavBarConstants.TAB_MENU_MAP ) {
           var tabElement = $(tabId);
           if( tabElement != null && typeof(tabElement.hasClassName) != 'undefined' && tabElement.hasClassName(GarminNavBarConstants.SELECTED_CLASS) ) {
                tabElement.toggleClassName(GarminNavBarConstants.SELECTED_CLASS);
           }
        }     
        // Select the new tab
        $(highlightTabId).toggleClassName(GarminNavBarConstants.SELECTED_CLASS);
    },    
    /**
     * Sets handlers for tab elements.  Only sets the events if the tab elements
     * listed in the mapping exist on the page. 
     */
    setEventHandlers: function() {             
        // Tab handlers
        for ( var tabId in GarminNavBarConstants.TAB_MENU_MAP ) {
            var tabElement = $(tabId);
            if( tabElement != null ) {
                tabElement.observe('mouseover', this.selectTab.bind(this, tabId));
            }
        }
        // Show the tab the page was originally on when cursor is out of navbar area
        $(GarminNavBarConstants.TABS_WRAPPER_ID).observe('mouseover', this.showDefaultTabMenu.bind(this));
    },    
    /**
     * Shows the menu for a given tab id if hidden
     * @param tabId {String} id of tab element to show menu for
     */
    selectTab: function(tabId) {
        var menuId = GarminNavBarConstants.TAB_MENU_MAP[tabId];
        // Hide all other menus
        for ( var tabIdTemp in GarminNavBarConstants.TAB_MENU_MAP ) {
            var tabElementTemp = $(tabIdTemp);
            if( tabElementTemp != null && tabIdTemp != tabId) {
                this._hideMenu(tabIdTemp, GarminNavBarConstants.TAB_MENU_MAP[tabIdTemp]);
            }
        }
        // Don't fade in if we're already there
        if(tabId == this.defaultTabId && tabId == this.selectedTabId) {
            $(menuId).show();
        } else {
            Effect.Appear(menuId, { from: 0.3, duration: 0.3 }); // from opacity, duration seconds
        }
        
        this._highlightTab(tabId);
        this.selectedTabId = tabId;
    },	
    showDefaultTabMenu: function() {
        this.selectTab(this.defaultTabId);
    },
    /**
     * Hides the the menu for a given tab id if visible
     * @param tabId {String} id of tab element to hide menu for
     * @private
     */		
    _hideMenu: function(tabId, menuId) {
        $(menuId).hide();
    }    
});
Event.observe(window, 'load', function() { //document.observe("dom:loaded", function() {
  garminNavBar = new Garmin.NavBar();
});
