/**
 * @requires jQuery v1.0.3
 *
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 * Version: 1.0
 */

/**
 * Based on JQuery.Tabs(v.2.7.2) plugin developed by Klaus Hartl
 * The original JQuery.Tabs plugin -> http://stilbuero.de/tabs/
 */

(function($) {
$.extend({
    menuTabs: {
        remoteCount: 0
    }
});

$.fn.menuTabs = function(initial, settings) {

    if (typeof initial == 'object') settings = initial; // no initial tab given but a settings object
    settings = $.extend({
        initial: (initial && typeof initial == 'number' && initial > 0) ? --initial : -1,
        disabled: null,
        spinner: 'Loading&#8230;',
        fxFade: null,
        fxSlide: null,
        fxShow: null,
        fxHide: null,
        fxSpeed: 'normal',
        fxShowSpeed: null,
        fxHideSpeed: null,
        fxAutoHeight: false,
        onClick: null,
        onHide: null,
        onShow: null,
        navClass: 'tabs-MainNav',
        selectedClass: 'tabs-MainSelected',
        disabledClass: 'tabs-MainDisabled',
        containerClass: 'tabs-menuContent',
        menuContentClass: 'tabs-menuContent',
        hideClass: 'tabs-menuHide',
        loadingClass: 'tabs-loading',
        tabStruct: 'div',
		useMenu: true
    }, settings || {});

    $.browser.msie6 = $.browser.msie6 || $.browser.msie && typeof XMLHttpRequest == 'function';

    function unFocus() {
        scrollTo(0, 0);
    }

    return this.each(function() {

        var container = this;
        var nav = $('ul.' + settings.navClass, container);
        nav = nav.size() && nav || $('>ul:eq(0)', container); // fallback to default structure
        var tabs = $('a', nav);

        var menuContent = $('div.' + settings.menuContentClass, container);
		menuContent.addClass(settings.hideClass);

        nav.is('.' + settings.navClass) || nav.addClass(settings.navClass);

        var hasSelectedClass = $('li', nav).index( $('li.' + settings.selectedClass, nav)[0] );
        if (hasSelectedClass >= 0) {
           settings.initial = hasSelectedClass;
        }

        if ($.browser.msie) {
            unFocus();
        }

		if ( settings.initial >= 0 )
			$('li', nav).removeClass(settings.selectedClass).eq(settings.initial).addClass(settings.selectedClass); // we need to remove classes eventually if hash takes precedence over class

        var showAnim = {}, hideAnim = {}, showSpeed = settings.fxShowSpeed || settings.fxSpeed, hideSpeed = settings.fxHideSpeed || settings.fxSpeed;
        
        if (settings.fxSlide || settings.fxFade) {
            if (settings.fxSlide) {
                showAnim['height'] = 'show';
                hideAnim['height'] = 'hide';
            }
            if (settings.fxFade) {
                showAnim['opacity'] = 'show';
                hideAnim['opacity'] = 'hide';
            }
        } else {
            if (settings.fxShow) {
                showAnim = settings.fxShow;
            } else {
                showAnim['min-width'] = 0;
                showSpeed = 1;
            }
            if (settings.fxHide) {
                hideAnim = settings.fxHide;
            } else {
                hideAnim['min-width'] = 0;
                hideSpeed = 1;
            }
        }

        var onClick = settings.onClick, onHide = settings.onHide, onShow = settings.onShow;

        tabs.bind('triggerTab', function() {
            var li = $(this).parents('li:eq(0)');
            if (container.locked || li.is('.' + settings.selectedClass) || li.is('.' + settings.disabledClass)) {
                return false;
            }

            var hash = this.hash;

            if ($.browser.msie) {
				$(this).trigger('click');
            } 
            
            /*else if ($.browser.safari) {
                var tempForm = $('<form action="' + hash + '"><div><input type="submit" value="h" /></div></form>').get(0); // no need to append it to the body
                tempForm.submit(); // does not trigger the form's submit event...
                $(this).trigger('click'); // ...thus do stuff here
            } 
            */
            else {
                $(this).trigger('click');
            }
        });

        tabs.bind('disableTab', function() {
            var li = $(this).parents('li:eq(0)');
            if ($.browser.safari) { /* Fix opacity of tab after disabling in Safari... */
                li.animate({ opacity: 0 }, 1, function() {
                   li.css({opacity: ''});
                });
            }
            li.addClass(settings.disabledClass);

        });

        if (settings.disabled && settings.disabled.length) {
            for (var i = 0, k = settings.disabled.length; i < k; i++) {
                tabs.eq(--settings.disabled[i]).trigger('disableTab').end();
            }
        };

        tabs.bind('enableTab', function() {
            var li = $(this).parents('li:eq(0)');
            li.removeClass(settings.disabledClass);
            if ($.browser.safari) { /* Fix disappearing tab after enabling in Safari... */
                li.animate({ opacity: 1 }, 1, function() {
                    li.css({opacity: ''});
                });
            }
        });

		if ( settings.useMenu )
		{
			menuContent.hover(
				function() { if ( container.menuContentTimer ) { clearTimeout( container.menuContentTimer ); container['menuContentTimer'] = null; } },
				function () {
					container['menuContentTimer'] = setTimeout(
						function() {
							$(container).triggerTab( settings.initial+1 );
							menuContent.hide();
						}, 200
					);
				}
			);		

			tabs.filter('[menudata]').hover(
				function ()
				{
					if ( container.menuContentTimer )
					{
						clearTimeout( container.menuContentTimer );
						container['menuContentTimer'] = null;
					}

					$(this).parents('li:eq(0)').addClass(settings.selectedClass).siblings().removeClass(settings.selectedClass);

					var tabItem = $(this);
					var tabItemOffset = {};
					$(this).offset( { margin:true, padding: true, border: true, scroll: false }, tabItemOffset );
					var scroll = { left: $(window).scrollLeft(), top: $(window).scrollTop() };
					var viewportWidth = $( window ).width();
					var viewportHeight = $( window ).height();
					var top, left;
					
					if ( (tabItemOffset.left - scroll.left) < (viewportWidth / 2) )
					{
						left = tabItemOffset.left;
					} else {
						left = tabItemOffset.left + $( this ).width() - tabItem.width();
					}
					if ( (tabItemOffset.top - scroll.top) < (viewportHeight / 2) )
					{
						top = tabItemOffset.top + $( this ).height() + 6;
					} else {
						top = tabItemOffset.top - tabItem.height() -15;
					}
					
					var menuContentUrl = $(this).attr('menudata');
					if (menuContentUrl != null)
					{
						menuContentUrl += ( menuContentUrl.indexOf('?') <= 0 ) ? '?' : '&';
						menuContentUrl += 'fpr=' + Math.round(Math.random()*1000000).toString();						
						menuContent.css ( { top: top + 'px', left: left + 'px' } )
						.html('')
						.load(menuContentUrl)
						.show();
					}
					else
					{
						menuContent.css ( { top: top + 'px', left: left + 'px' } )
						.html('')
						.show();
					}
				},
				function ()
				{
					container['menuContentTimer'] = setTimeout(
						function() {
							menuContent.hide();
							$(container).triggerTab( settings.initial+1 );
						}, 200
					);
				}
			);
		}

        tabs.bind('click', function(e) {

            var trueClick = e.clientX;            
            var clicked = this, li = $(this).parents('li:eq(0)');
            var toShow = $(clicked).attr('mncnt');

            if (container.locked || li.is('.' + settings.disabledClass) || typeof onClick == 'function' && onClick(this, toShow[0], toHide[0]) === false) {
                this.blur();
                return false;
            }

            container['locked'] = true;
			$(clicked).parents('li:eq(0)').addClass(settings.selectedClass).siblings().removeClass(settings.selectedClass);
			container['locked'] = null;

            var scrollX = window.pageXOffset || document.documentElement && document.documentElement.scrollLeft || document.body.scrollLeft || 0;
            var scrollY = window.pageYOffset || document.documentElement && document.documentElement.scrollTop || document.body.scrollTop || 0;
            
            setTimeout(function() {
                window.scrollTo(scrollX, scrollY);
            }, 0);

            this.blur();

			return !!trueClick;

        });

    });

};

var tabEvents = ['triggerTab', 'disableTab', 'enableTab'];
for (var i = 0; i < tabEvents.length; i++) {
    $.fn[tabEvents[i]] = (function(tabEvent) {
        return function(tab) {
            return this.each(function() {
                var nav = $('ul.tabs-MainNav' , this);
                nav = nav.size() && nav || $('>ul:eq(0)', this); // fallback to default structure
                var a;
                if (!tab || typeof tab == 'number') {
                    a = $('li a', nav).eq((tab && tab > 0 && tab - 1 || 0)); // fall back to 0
                } else if (typeof tab == 'string') {
                    a = $('li a[href$="#' + tab + '"]', nav);
                }
                a.trigger(tabEvent);
            });
        };
    })(tabEvents[i]);
}
for (var i = 0; i < tabEvents.length; i++) {
    $.fn[tabEvents[i]] = (function(tabEvent) {
        return function(tab) {
            return this.each(function() {
                var nav = $('ul.tabs-HotelDetail' , this);
                nav = nav.size() && nav || $('>ul:eq(0)', this); // fallback to default structure
                var a;
                if (!tab || typeof tab == 'number') {
                    a = $('li a', nav).eq((tab && tab > 0 && tab - 1 || 0)); // fall back to 0
                } else if (typeof tab == 'string') {
                    a = $('li a[href$="#' + tab + '"]', nav);
                }
                a.trigger(tabEvent);
            });
        };
    })(tabEvents[i]);
}
for (var i = 0; i < tabEvents.length; i++) {
    $.fn[tabEvents[i]] = (function(tabEvent) {
        return function(tab) {
            return this.each(function() {
                var nav = $('ul.tabs-TourDetail' , this);
                nav = nav.size() && nav || $('>ul:eq(0)', this); // fallback to default structure
                var a;
                if (!tab || typeof tab == 'number') {
                    a = $('li a', nav).eq((tab && tab > 0 && tab - 1 || 0)); // fall back to 0
                } else if (typeof tab == 'string') {
                    a = $('li a[href$="#' + tab + '"]', nav);
                }
                a.trigger(tabEvent);
            });
        };
    })(tabEvents[i]);
}
for (var i = 0; i < tabEvents.length; i++) {
    $.fn[tabEvents[i]] = (function(tabEvent) {
        return function(tab) {
            return this.each(function() {
                var nav = $('ul.tabs-CruiseDetail' , this);
                nav = nav.size() && nav || $('>ul:eq(0)', this); // fallback to default structure
                var a;
                if (!tab || typeof tab == 'number') {
                    a = $('li a', nav).eq((tab && tab > 0 && tab - 1 || 0)); // fall back to 0
                } else if (typeof tab == 'string') {
                    a = $('li a[href$="#' + tab + '"]', nav);
                }
                a.trigger(tabEvent);
            });
        };
    })(tabEvents[i]);
}


$.fn.activeTab = function() {
    var selectedTabs = [];
    this.each(function() {
        var nav = $('ul.tabs-MainNav' , this);
        nav = nav.size() && nav || $('>ul:eq(0)', this); //fallback to default structure
        var lis = $('li', nav);
        selectedTabs.push(lis.index( lis.filter('.tabs-MainSelected')[0] ) + 1);
    });
    return selectedTabs[0];
};

})(jQuery);
