/**
 * jQuery plugin: Sliding Tabs
 * Tabs with a slider instead of tabs.
 *
 * window.devicePixelRatio is used to detect Safari.  Not sure why the
 * discrepancy in Safari and every other browser, but it's something I will
 * look into later.
 *
 * @copyright (c) 2009 Kalley Powell
 */
(function($) {

    var initial = true;

    $.fn.slidingTabs = function(options) {

        var opts = options ? $.extend({}, $.fn.slidingTabs.defaults, options) : $.fn.slidingTabs.defaults;

        return this.each(function() {

            var $this = $(this).css('position', 'relative');

            var o = $.metadata ? $.extend({}, opts, $this.metadata()) : opts;
            
            var uniqSelector = createUniqClass(o.prefix);

            $this.addClass(uniqSelector);

            var width = 0;
            var height = 0;
            var h;
            var $pages = $(o.pages, $this).each(function() {
                var $this = $(this);
                if((h = $this.outerHeight(true)) > height)
                    height = h;
                width += $this.outerWidth(true) + (window.devicePixelRatio ? 10 : 0);
                $this.width($this.width());
            }).css('float', 'left').find('a').attr('tabindex', -1).end();
            $pages.eq(0).find('a').removeAttr('tabindex');
            var $content = $pages.wrapAll('<div class="'+o.prefix+'-wrapper'+'" style="width:'+$pages.width()+'px"><div /></div>')
                .parent().width(width).css({
                    left: '0px',
                    position: 'relative'
                }).parent();

            var $nav = $(o.nav, $this)['insert'+o.position.replace(/\w+/g, function(a){
                return a.charAt(0).toUpperCase() + a.substr(1).toLowerCase();
            })]($content).addClass(o.prefix+'-nav');
            var $tabs = $(o.tabs, $nav);
            $tabs.width($nav.width() / $tabs.length - o.tabMargin).css('margin-right', o.tabMargin);

            var $bar = $('<div class="'+o.prefix+'-bar"><div class="'+o.prefix+'-bar-icon">'+o.scrollbarText+'</span></div>').insertBefore($nav);
            $bar.width($nav.width() / $tabs.length - (o.tabMargin + parseInt($bar.css('padding-right')) + parseInt($bar.css('padding-left')))).css('margin-right', o.tabMargin);
            $tabs.each(function() {
                var $this = $(this);
                $this.find('a').each(function() {
                    $(this).click(function(ev) {
                        ev.preventDefault();
                        var pos = $this.offset().left - $this.offsetParent().offset().left;
                        var page_id = this.href.substr(this.href.indexOf('#'));
                        var page = $pages.find('a').attr('tabindex', -1).end().filter(page_id).find('a').removeAttr('tabindex').end();
                        if(initial && (! $.support.leadingWhitespace || window.devicePixelRatio)) {
                            $bar.css('left', pos+'px');
                            $pages.parent().css('left', -$pages.parent().width()).css('left', -parseInt(page.position().left));
                        } else {
                            $bar.animate({
                                left: pos
                            }, o.speed, o.easing);
                            $pages.parent().animate({
                                left: -parseInt(page.position().left)
                            }, o.speed, o.easing);
                            if(o.callback)
                                o.callback(this.href.substr(this.href.indexOf('#')));
                        }
                        initial = false;
                    }).focus(function() {
                        if(o.focusColor)
                            $this.css('background-color', o.focusColor).siblings().css('background-color', '');
                    });
                });
            });
            var amtToMove = width  / $nav.width();
            $bar.draggable({
                axis: 'x',
                containment: $this,
                drag: function(ev, ui) {
                    $pages.parent().css('left', -Math.ceil(amtToMove * ui.position.left));
                },
                snap: '.'+uniqSelector+' .'+o.prefix+'-nav '+o.tabs,
                snapMode: o.snapMode,
                snapTolerance: o.snapTolerance,
                stop: function(ev, ui) {
                    var stop;
                    var diff;
                    $($bar.draggable('option', 'snap')).each(function() {
                        var pos = $(this).offset().left - $(this).offsetParent().offset().left;
                        if(diff === undefined || Math.abs(ui.position.left - pos) < diff) {
                            diff = Math.abs(ui.position.left - pos);
                            stop = $(this).find('a:first');
                        }
                    });
                    stop.click();
                }
            });

        });

    };

    function createUniqClass(prefix) {
        for(var i = 1; i < 999; i++) {
            if( ! $('.'+prefix+'-'+i)[0]) {
                return prefix+'-'+i;
            }
        }
        return false;
    }

    $.fn.slidingTabs.defaults = {
        easing: 'swing',
        nav: 'ul:first',
        pages: '>div',
        position: 'before',
        prefix: 'sliding-tabs',
        scrollbarText: '',
        snapMode: 'inner',
        snapTolerance: 10,
        speed: 500,
        tabMargin: 5,
        tabs: '>li'
    };

})(jQuery);