/**
 * Tabs - jQuery plugin for accessible, unobtrusive tabs
 * @requires jQuery v1.1.1
 *
 * http://stilbuero.de/tabs/
 *
 * Copyright (c) 2006 Klaus Hartl (stilbuero.de)
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 * Version: 2.7.4
 */
(function ($) {
    $.extend({
        tabs: {
            remoteCount: 0
        }
    });
    $.fn.tabs = function (initial, settings) {
        if (typeof initial == 'object') settings = initial;
        settings = $.extend({
            initial: (initial && typeof initial == 'number' && initial > 0) ? --initial : 0,
            disabled: null,
            bookmarkable: $.ajaxHistory ? true : false,
            remote: false,
            spinner: 'Loading&#8230;',
            hashPrefix: 'remote-tab-',
            fxFade: null,
            fxSlide: null,
            fxShow: null,
            fxHide: null,
            fxSpeed: 'normal',
            fxShowSpeed: null,
            fxHideSpeed: null,
            fxAutoHeight: false,
            onClick: null,
            onHide: null,
            onShow: null,
            navClass: 'tabs-nav',
            selectedClass: 'tabs-selected',
            disabledClass: 'tabs-disabled',
            containerClass: 'tabs-container',
            hideClass: 'tabs-hide',
            loadingClass: 'tabs-loading',
            tabStruct: 'div'
        }, settings || {});
        $.browser.msie6 = $.browser.msie && ($.browser.version && $.browser.version < 7 || /MSIE 6.0/.test(navigator.userAgent));

        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);
            var tabs = $('a', nav);
            if (settings.remote) {
                tabs.each(function () {
                    var id = settings.hashPrefix + (++$.tabs.remoteCount),
                        hash = '#' + id,
                        url = this.href;
                    this.href = hash;
                    $('<div id="' + id + '" class="' + settings.containerClass + '"></div>').appendTo(container);
                    $(this).bind('loadRemoteTab', function (e, callback) {
                        var $$ = $(this).addClass(settings.loadingClass),
                            span = $('span', this)[0],
                            tabTitle = span.innerHTML;
                        if (settings.spinner) {
                            span.innerHTML = '<em>' + settings.spinner + '</em>';
                        }
                        setTimeout(function () {
                            $(hash).load(url, function () {
                                if (settings.spinner) {
                                    span.innerHTML = tabTitle;
                                }
                                $$.removeClass(settings.loadingClass);
                                callback && callback();
                            });
                        }, 0);
                    });
                });
            }
            var containers = $('div.' + settings.containerClass, container);
            containers = containers.size() && containers || $('>' + settings.tabStruct, container);
            nav.is('.' + settings.navClass) || nav.addClass(settings.navClass);
            containers.each(function () {
                var $$ = $(this);
                $$.is('.' + settings.containerClass) || $$.addClass(settings.containerClass);
            });
            var hasSelectedClass = $('li', nav).index($('li.' + settings.selectedClass, nav)[0]);
            if (hasSelectedClass >= 0) {
                settings.initial = hasSelectedClass;
            }
            if (location.hash) {
                tabs.each(function (i) {
                    if (this.hash == location.hash) {
                        settings.initial = i;
                        if (($.browser.msie || $.browser.opera) && !settings.remote) {
                            var toShow = $(location.hash);
                            var toShowId = toShow.attr('id');
                            toShow.attr('id', '');
                            setTimeout(function () {
                                toShow.attr('id', toShowId);
                            }, 500);
                        }
                        unFocus();
                        return false;
                    }
                });
            }
            if ($.browser.msie) {
                unFocus();
            }
            containers.filter(':eq(' + settings.initial + ')').show().end().not(':eq(' + settings.initial + ')').addClass(settings.hideClass);
            $('li', nav).removeClass(settings.selectedClass).eq(settings.initial).addClass(settings.selectedClass);
            tabs.eq(settings.initial).trigger('loadRemoteTab').end();
            if (settings.fxAutoHeight) {
                var _setAutoHeight = function (reset) {
                    var heights = $.map(containers.get(), function (el) {
                        var h, jq = $(el);
                        if (reset) {
                            if ($.browser.msie6) {
                                el.style.removeExpression('behaviour');
                                el.style.height = '';
                                el.minHeight = null;
                            }
                            h = jq.css({
                                'min-height': ''
                            }).height();
                        } else {
                            h = jq.height();
                        }
                        return h;
                    }).sort(function (a, b) {
                        return b - a;
                    });
                    if ($.browser.msie6) {
                        containers.each(function () {
                            this.minHeight = heights[0] + 'px';
                            this.style.setExpression('behaviour', 'this.style.height = this.minHeight ? this.minHeight : "1px"');
                        });
                    } else {
                        containers.css({
                            'min-height': heights[0] + 'px'
                        });
                    }
                };
                _setAutoHeight();
                var cachedWidth = container.offsetWidth;
                var cachedHeight = container.offsetHeight;
                var watchFontSize = $('#tabs-watch-font-size').get(0) || $('<span id="tabs-watch-font-size">M</span>').css({
                    display: 'block',
                    position: 'absolute',
                    visibility: 'hidden'
                }).appendTo(document.body).get(0);
                var cachedFontSize = watchFontSize.offsetHeight;
                setInterval(function () {
                    var currentWidth = container.offsetWidth;
                    var currentHeight = container.offsetHeight;
                    var currentFontSize = watchFontSize.offsetHeight;
                    if (currentHeight > cachedHeight || currentWidth != cachedWidth || currentFontSize != cachedFontSize) {
                        _setAutoHeight((currentWidth > cachedWidth || currentFontSize < cachedFontSize));
                        cachedWidth = currentWidth;
                        cachedHeight = currentHeight;
                        cachedFontSize = currentFontSize;
                    }
                }, 50);
            }
            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');
                    if (settings.bookmarkable) {
                        $.ajaxHistory.update(hash);
                        location.hash = hash.replace('#', '');
                    }
                } else if ($.browser.safari) {
                    var tempForm = $('<form action="' + hash + '"><div><input type="submit" value="h" /></div></form>').get(0);
                    tempForm.submit();
                    $(this).trigger('click');
                    if (settings.bookmarkable) {
                        $.ajaxHistory.update(hash);
                    }
                } else {
                    if (settings.bookmarkable) {
                        location.hash = hash.replace('#', '');
                    } else {
                        $(this).trigger('click');
                    }
                }
            });
            tabs.bind('disableTab', function () {
                var li = $(this).parents('li:eq(0)');
                if ($.browser.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) {
                    li.animate({
                        opacity: 1
                    }, 1, function () {
                        li.css({
                            opacity: ''
                        });
                    });
                }
            });
            tabs.bind('click', function (e) {
                var trueClick = e.clientX;
                var clicked = this,
                    li = $(this).parents('li:eq(0)'),
                    toShow = $(this.hash),
                    toHide = containers.filter(':visible');
                if (container['locked'] || li.is('.' + settings.selectedClass) || li.is('.' + settings.disabledClass) || typeof onClick == 'function' && onClick(this, toShow[0], toHide[0]) === false) {
                    this.blur();
                    return false;
                }
                container['locked'] = true;
                if (toShow.size()) {
                    if ($.browser.msie && settings.bookmarkable) {
                        var toShowId = this.hash.replace('#', '');
                        toShow.attr('id', '');
                        setTimeout(function () {
                            toShow.attr('id', toShowId);
                        }, 0);
                    }
                    var resetCSS = {
                        display: '',
                        overflow: '',
                        height: ''
                    };
                    if (!$.browser.msie) {
                        resetCSS['opacity'] = '';
                    }
                    function switchTab() {
                        if (settings.bookmarkable && trueClick) {
                            $.ajaxHistory.update(clicked.hash);
                        }
                        toHide.animate(hideAnim, hideSpeed, function () {
                            $(clicked).parents('li:eq(0)').addClass(settings.selectedClass).siblings().removeClass(settings.selectedClass);
                            toHide.addClass(settings.hideClass).css(resetCSS);
                            if (typeof onHide == 'function') {
                                onHide(clicked, toShow[0], toHide[0]);
                            }
                            if (!(settings.fxSlide || settings.fxFade || settings.fxShow)) {
                                toShow.css('display', 'block');
                            }
                            toShow.animate(showAnim, showSpeed, function () {
                                toShow.removeClass(settings.hideClass).css(resetCSS);
                                if ($.browser.msie) {
                                    toHide[0].style.filter = '';
                                    toShow[0].style.filter = '';
                                }
                                if (typeof onShow == 'function') {
                                    onShow(clicked, toShow[0], toHide[0]);
                                }
                                container['locked'] = null;
                            });
                        });
                    }
                    if (!settings.remote) {
                        switchTab();
                    } else {
                        $(clicked).trigger('loadRemoteTab', [switchTab]);
                    }
                } else {
                    alert('There is no such container.');
                }
                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 settings.bookmarkable && !! trueClick;
            });
            if (settings.bookmarkable) {
                $.ajaxHistory.initialize(function () {
                    tabs.eq(settings.initial).trigger('click').end();
                });
            }
        });
    };
    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-nav', this);
                    nav = nav.size() && nav || $('>ul:eq(0)', this);
                    var a;
                    if (!tab || typeof tab == 'number') {
                        a = $('li a', nav).eq((tab && tab > 0 && tab - 1 || 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-nav', this);
            nav = nav.size() && nav || $('>ul:eq(0)', this);
            var lis = $('li', nav);
            selectedTabs.push(lis.index(lis.filter('.tabs-selected')[0]) + 1);
        });
        return selectedTabs[0];
    };
})(jQuery);
