(function(k) {
    k.fn.tabs = function() {
        var b = typeof arguments[0] == 'string' && arguments[0];
        var c = b && Array.prototype.slice.call(arguments, 1) || arguments;
        return b == 'length' ? k.data(this[0], 'tabs').$tabs.length: this.each(function() {
            if (b) {
                var a = k.data(this, 'tabs');
                if (a) a[b].apply(a, c)
            } else new k.ui.tabs(this, c[0] || {})
        })
    };
    k.ui.tabs = function(d, e) {
        var f = this;
        this.options = k.extend({},
        k.ui.tabs.defaults, e);
        this.element = d;
        if (e.selected === null) this.options.selected = null;
        this.options.event += '.tabs';
        k(d).bind('setData.tabs', function(a, b, c) {
            if ((/^selected/).test(b)) f.select(c);
            else {
                f.options[b] = c;
                f.tabify()
            }
        }).bind('getData.tabs', function(a, b) {
            return f.options[b]
        });
        k.data(d, 'tabs', this);
        this.tabify(true)
    };
    k.ui.tabs.defaults = {
        cleaer_h: 0,
        selected: 0,
        unselect: false,
        event: 'click',
        disabled: [],
        cookie: null,
        spinner: 'Loading&#8230;',
        cache: false,
        idPrefix: 'ui-tabs-',
        ajaxOptions: {},
        fx: null,
        tabTemplate: '<li><a href="#{href}"><span>#{label}</span></a></li>',
        panelTemplate: '<div></div>',
        navClass: 'ui-tabs-nav',
        selectedClass: 'ui-tabs-selected',
        unselectClass: 'ui-tabs-unselect',
        disabledClass: 'ui-tabs-disabled',
        panelClass: 'ui-tabs-panel',
        hideClass: 'ui-tabs-hide',
        loadingClass: 'ui-tabs-loading'
    };
    k.extend(k.ui.tabs.prototype, {
        tabId: function(a) {
            return a.title && a.title.replace(/\s/g, '_').replace(/[^A-Za-z0-9\-_:\.]/g, '') || this.options.idPrefix + k.data(a)
        },
        ui: function(a, b) {
            return {
                instance: this,
                options: this.options,
                tab: a,
                panel: b
            }
        },
        tabify: function(e) {
            this.$lis = k('li:has(a[href])', this.element);
            this.$tabs = this.$lis.map(function() {
                return k('a', this)[0]
            });
            this.$panels = k([]);
            var f = this,
            o = this.options;
            this.$tabs.each(function(i, a) {
                if (a.hash && a.hash.replace('#', '')) f.$panels = f.$panels.add(a.hash);
                else if (k(a).attr('href') != '#') {
                    k.data(a, 'href.tabs', a.href);
                    k.data(a, 'load.tabs', a.href);
                    var b = f.tabId(a);
                    a.href = '#' + b;
                    var c = k('#' + b);
                    if (!c.length) {
                        c = k(o.panelTemplate).attr('id', b).addClass(o.panelClass).insertAfter(f.$panels[i - 1] || f.element);
                        c.data('destroy.tabs', true)
                    }
                    f.$panels = f.$panels.add(c)
                } else o.disabled.push(i + 1)
            });
            if (e) {
                k(this.element).hasClass(o.navClass) || k(this.element).addClass(o.navClass);
                this.$panels.each(function() {
                    var a = k(this);
                    a.hasClass(o.panelClass) || a.addClass(o.panelClass)
                });
                this.$tabs.each(function(i, a) {
                    if (location.hash) {
                        if (a.hash == location.hash) {
                            o.selected = i;
                            if (k.browser.msie || k.browser.opera) {
                                var b = k(location.hash),
                                toShowId = b.attr('id');
                                b.attr('id', '');
                                setTimeout(function() {
                                    b.attr('id', toShowId)
                                },
                                500)
                            }
                            scrollTo(0, 0);
                            return false
                        }
                    } else if (o.cookie) {
                        var c = parseInt(k.cookie('ui-tabs' + k.data(f.element)), 10);
                        if (c && f.$tabs[c]) {
                            o.selected = c;
                            return false
                        }
                    } else if (f.$lis.eq(i).hasClass(o.selectedClass)) {
                        o.selected = i;
                        return false
                    }
                });
                this.$panels.addClass(o.hideClass);
                this.$lis.removeClass(o.selectedClass);
                if (o.selected !== null) {
                    this.$panels.eq(o.selected).show().removeClass(o.hideClass);
                    this.$lis.eq(o.selected).addClass(o.selectedClass)
                }
                var g = o.selected !== null && k.data(this.$tabs[o.selected], 'load.tabs');
                if (g) this.load(o.selected);
                o.disabled = k.unique(o.disabled.concat(k.map(this.$lis.filter('.' + o.disabledClass), function(n, i) {
                    return f.$lis.index(n)
                }))).sort();
                k(window).bind('unload', function() {
                    f.$tabs.unbind('.tabs');
                    f.$lis = f.$tabs = f.$panels = null
                })
            }
            for (var i = 0, li; li = this.$lis[i]; i++) k(li)[k.inArray(i, o.disabled) != -1 && !k(li).hasClass(o.selectedClass) ? 'addClass': 'removeClass'](o.disabledClass);
            if (o.cache === false) this.$tabs.removeData('cache.tabs');
            var h, showFx, baseFx = {
                'min-width': 0,
                duration: 1
            },
            baseDuration = 'normal';
            if (o.fx && o.fx.constructor == Array) h = o.fx[0] || baseFx,
            showFx = o.fx[1] || baseFx;
            else h = showFx = o.fx || baseFx;
            if (o.cleaer_h) var j = {
                display: '',
                overflow: ''
            };
            else var j = {
                display: '',
                overflow: '',
                height: ''
            };
            if (!k.browser.msie) j.opacity = '';
            function hideTab(a, b, c) {
                b.animate(h, h.duration || baseDuration, function() {
                    b.addClass(o.hideClass).css(j);
                    if (k.browser.msie && h.opacity) b[0].style.filter = '';
                    if (c) showTab(a, c, b)
                })
            }
            function showTab(a, b, c) {
                if (showFx === baseFx) b.css('display', 'block');
                b.animate(showFx, showFx.duration || baseDuration, function() {
                    b.removeClass(o.hideClass).css(j);
                    if (k.browser.msie && showFx.opacity) b[0].style.filter = '';
                    k(f.element).triggerHandler('tabsshow', [f.ui(a, b[0])], o.show)
                })
            }
            function switchTab(a, b, c, d) {
                b.addClass(o.selectedClass).siblings().removeClass(o.selectedClass);
                hideTab(a, c, d)
            }
            this.$tabs.unbind('.tabs').bind(o.event, function() {
                var b = k(this).parents('li:eq(0)'),
                $hide = f.$panels.filter(':visible'),
                $show = k(this.hash);
                if ((b.hasClass(o.selectedClass) && !o.unselect) || b.hasClass(o.disabledClass) || k(this).hasClass(o.loadingClass) || k(f.element).triggerHandler('tabsselect', [f.ui(this, $show[0])], o.select) === false) {
                    this.blur();
                    return false
                }
                f.options.selected = f.$tabs.index(this);
                if (o.unselect) {
                    if (b.hasClass(o.selectedClass)) {
                        f.options.selected = null;
                        b.removeClass(o.selectedClass);
                        f.$panels.stop();
                        hideTab(this, $hide);
                        this.blur();
                        return false
                    } else if (!$hide.length) {
                        f.$panels.stop();
                        var a = this;
                        f.load(f.$tabs.index(this), function() {
                            b.addClass(o.selectedClass).addClass(o.unselectClass);
                            showTab(a, $show)
                        });
                        this.blur();
                        return false
                    }
                }
                if (o.cookie) k.cookie('ui-tabs' + k.data(f.element), f.options.selected, o.cookie);
                f.$panels.stop();
                if ($show.length) {
                    var a = this;
                    f.load(f.$tabs.index(this), $hide.length ?
                    function() {
                        switchTab(a, b, $hide, $show)
                    }: function() {
                        b.addClass(o.selectedClass);
                        showTab(a, $show)
                    })
                } else throw 'jQuery UI Tabs: Mismatching fragment identifier.';
                if (k.browser.msie) this.blur();
                return false
            });
            if (! (/^click/).test(o.event)) this.$tabs.bind('click.tabs', function() {
                return false
            })
        },
        add: function(a, b, c) {
            if (c == undefined) c = this.$tabs.length;
            var o = this.options;
            var d = k(o.tabTemplate.replace(/#\{href\}/, a).replace(/#\{label\}/, b));
            d.data('destroy.tabs', true);
            var e = a.indexOf('#') == 0 ? a.replace('#', '') : this.tabId(k('a:first-child', d)[0]);
            var f = k('#' + e);
            if (!f.length) {
                f = k(o.panelTemplate).attr('id', e).addClass(o.panelClass).addClass(o.hideClass);
                f.data('destroy.tabs', true)
            }
            if (c >= this.$lis.length) {
                d.appendTo(this.element);
                f.appendTo(this.element.parentNode)
            } else {
                d.insertBefore(this.$lis[c]);
                f.insertBefore(this.$panels[c])
            }
            o.disabled = k.map(o.disabled, function(n, i) {
                return n >= c ? ++n: n
            });
            this.tabify();
            if (this.$tabs.length == 1) {
                d.addClass(o.selectedClass);
                f.removeClass(o.hideClass);
                var g = k.data(this.$tabs[0], 'load.tabs');
                if (g) this.load(c, g)
            }
            k(this.element).triggerHandler('tabsadd', [this.ui(this.$tabs[c], this.$panels[c])], o.add)
        },
        remove: function(a) {
            var o = this.options,
            $li = this.$lis.eq(a).remove(),
            $panel = this.$panels.eq(a).remove();
            if ($li.hasClass(o.selectedClass) && this.$tabs.length > 1) this.select(a + (a + 1 < this.$tabs.length ? 1 : -1));
            o.disabled = k.map(k.grep(o.disabled, function(n, i) {
                return n != a
            }), function(n, i) {
                return n >= a ? --n: n
            });
            this.tabify();
            k(this.element).triggerHandler('tabsremove', [this.ui($li.find('a')[0], $panel[0])], o.remove)
        },
        enable: function(a) {
            var o = this.options;
            if (k.inArray(a, o.disabled) == -1) return;
            var b = this.$lis.eq(a).removeClass(o.disabledClass);
            if (k.browser.safari) {
                b.css('display', 'inline-block');
                setTimeout(function() {
                    b.css('display', 'block')
                },
                0)
            }
            o.disabled = k.grep(o.disabled, function(n, i) {
                return n != a
            });
            k(this.element).triggerHandler('tabsenable', [this.ui(this.$tabs[a], this.$panels[a])], o.enable)
        },
        disable: function(a) {
            var b = this,
            o = this.options;
            if (a != o.selected) {
                this.$lis.eq(a).addClass(o.disabledClass);
                o.disabled.push(a);
                o.disabled.sort();
                k(this.element).triggerHandler('tabsdisable', [this.ui(this.$tabs[a], this.$panels[a])], o.disable)
            }
        },
        select: function(a) {
            if (typeof a == 'string') a = this.$tabs.index(this.$tabs.filter('[href$=' + a + ']')[0]);
            this.$tabs.eq(a).trigger(this.options.event)
        },
        load: function(b, c) {
            var d = this,
            o = this.options,
            $a = this.$tabs.eq(b),
            a = $a[0],
            bypassCache = c == undefined || c === false,
            url = $a.data('load.tabs');
            c = c ||
            function() {};
            if (!url || (k.data(a, 'cache.tabs') && !bypassCache)) {
                c();
                return
            }
            if (o.spinner) {
                var e = k('span', a);
                e.data('label.tabs', e.html()).html('<em>' + o.spinner + '</em>')
            }
            var f = function() {
                d.$tabs.filter('.' + o.loadingClass).each(function() {
                    k(this).removeClass(o.loadingClass);
                    if (o.spinner) {
                        var a = k('span', this);
                        a.html(a.data('label.tabs')).removeData('label.tabs')
                    }
                });
                d.xhr = null
            };
            var g = k.extend({},
            o.ajaxOptions, {
                url: url,
                success: function(r, s) {
                    k(a.hash).html(r);
                    f();
                    c();
                    if (o.cache) k.data(a, 'cache.tabs', true);
                    k(d.element).triggerHandler('tabsload', [d.ui(d.$tabs[b], d.$panels[b])], o.load);
                    o.ajaxOptions.success && o.ajaxOptions.success(r, s)
                }
            });
            if (this.xhr) {
                this.xhr.abort();
                f()
            }
            $a.addClass(o.loadingClass);
            setTimeout(function() {
                d.xhr = k.ajax(g)
            },
            0)
        },
        url: function(a, b) {
            this.$tabs.eq(a).removeData('cache.tabs').data('load.tabs', b)
        },
        destroy: function() {
            var o = this.options;
            k(this.element).unbind('.tabs').removeClass(o.navClass).removeData('tabs');
            this.$tabs.each(function() {
                var b = k.data(this, 'href.tabs');
                if (b) this.href = b;
                var c = k(this).unbind('.tabs');
                k.each(['href', 'load', 'cache'], function(i, a) {
                    c.removeData(a + '.tabs')
                })
            });
            this.$lis.add(this.$panels).each(function() {
                if (k.data(this, 'destroy.tabs')) k(this).remove();
                else k(this).removeClass([o.selectedClass, o.unselectClass, o.disabledClass, o.panelClass, o.hideClass].join(' '))
            })
        }
    });
    k.extend(k.ui.tabs.prototype, {
        rotation: null,
        rotate: function(a, b) {
            b = b || false;
            var c = this,
            t = this.options.selected;
            function start() {
                c.rotation = setInterval(function() {
                    t = ++t < c.$tabs.length ? t: 0;
                    c.select(t)
                },
                a)
            }
            function stop(e) {
                if (!e || e.clientX) {
                    clearInterval(c.rotation)
                }
            }
            if (a) {
                start();
                if (!b) this.$tabs.bind(this.options.event, stop);
                else this.$tabs.bind(this.options.event, function() {
                    stop();
                    t = c.options.selected;
                    start()
                })
            } else {
                stop();
                this.$tabs.unbind(this.options.event, stop)
            }
        }
    })
})(jq2j);
