/*************************************************
 *
 *	project:  	liteAccordion - horizontal accordion plugin for jQuery
 *	author:   	Nicola Hibbert
 *	url:	  	http://nicolahibbert.com/horizontal-accordion-jquery-plugin
 *	demo:	  	http://www.nicolahibbert.com/demo/liteAccordion
 *
 *	Version:  	1.1.3
 *	Copyright: 	(c) 2010-2011 Nicola Hibbert
 *
 /*************************************************/
;
(function ($) {

    $.fn.liteAccordion = function (options) {

        // defaults
        var defaults = {
            containerWidth: 960,
            containerHeight: 320,
            headerWidth: 48,

            firstSlide: 1,
            onActivate: function () {},
            slideSpeed: 800,
            slideCallback: function () {},

            autoPlay: false,
            pauseOnHover: false,
            cycleSpeed: 6000,

            theme: 'basic',
            // basic, light*, dark, stitch*
            rounded: false,
            enumerateSlides: false
        },

            // merge defaults with options in new settings object				
            settings = $.extend({}, defaults, options),

            // define key variables
            $accordion = this,
            $slides = $accordion.find('li'),
            slideLen = $slides.length,
            slideWidth = settings.containerWidth - (slideLen * settings.headerWidth),
            $header = $slides.children('h2'),

            // core utility and animation methods
            utils = {
                getGroup: function (pos, index) {
                    if (this.offsetLeft === pos.left) {
                        return $header.slice(index + 1, slideLen).filter(function () {
                            return this.offsetLeft === $header.index(this) * settings.headerWidth
                        });
                    } else if (this.offsetLeft === pos.right) {
                        return $header.slice(0, index + 1).filter(function () {
                            return this.offsetLeft === slideWidth + ($header.index(this) * settings.headerWidth)
                        });
                    }
                },
                nextSlide: function (slideIndex) {
                    var slide = slideIndex + 1 || settings.firstSlide;

                    // get index of next slide
                    return function () {
                        return slide++ % slideLen;
                    }
                },
                play: function (slideIndex) {
                    var getNext = utils.nextSlide((slideIndex) ? slideIndex : ''),
                        // create closure
                        start = function () {
                            $header.eq(getNext()).click();
                        };

                    utils.playing = setInterval(start, settings.cycleSpeed);
                },
                pause: function () {
                    clearInterval(utils.playing);
                },
                playing: 0,
                sentinel: false
            };

        // set container heights, widths, theme & corner style
        $accordion.height(settings.containerHeight).width(settings.containerWidth).addClass(settings.theme).addClass(settings.rounded && 'rounded');

        // set tab width, height and selected class
        $header.width(settings.containerHeight).height(settings.headerWidth).eq(settings.firstSlide - 1).addClass('selected');

        // ie :(
        if ($.browser.msie) {
            if ($.browser.version.substr(0, 1) > 8) {
                $header.css('filter', 'none');
            } else if ($.browser.version.substr(0, 1) < 7) {
                return false;
            }
        }

        // set initial positions for each slide
        $header.each(function (index) {
            var $this = $(this),
                left = index * settings.headerWidth;

            if (index >= settings.firstSlide) left += slideWidth;

            $this.css('left', left).next().width(slideWidth).css({
                left: left,
                paddingLeft: settings.headerWidth
            });

            // add number to bottom of tab
            settings.enumerateSlides && $this.append('<b>' + (index + 1) + '</b>');

        });

        // bind event handler for activating slides
        $header.click(function (e) {
            var $this = $(this),
                index = $header.index($this),
                $next = $this.next(),
                pos = {
                    left: index * settings.headerWidth,
                    right: index * settings.headerWidth + slideWidth,
                    newPos: 0
                },
                $group = utils.getGroup.call(this, pos, index);

            // set animation direction
            if (this.offsetLeft === pos.left) {
                pos.newPos = slideWidth;
            } else if (this.offsetLeft === pos.right) {
                pos.newPos = -slideWidth;
            }

            // check if animation in progress
            if (!$header.is(':animated')) {

                // activate onclick callback with slide div as context		
                if (e.originalEvent) {
                    if (utils.sentinel === this) return false;
                    settings.onActivate.call($next);
                    utils.sentinel = this;
                } else {
                    settings.onActivate.call($next);
                    utils.sentinel = false;
                }

                // remove, then add selected class
                $header.removeClass('selected').filter($this).addClass('selected');

                // get group of tabs & animate			
                $group.animate({
                    left: '+=' + pos.newPos
                }, settings.slideSpeed, function () {
                    settings.slideCallback.call($next)
                }).next().animate({
                    left: '+=' + pos.newPos
                }, settings.slideSpeed);

            }
        });

        // pause on hover			
        if (settings.pauseOnHover) {
            $accordion.hover(function () {
                utils.pause();
            }, function () {
                utils.play($header.index($header.filter('.selected')));
            });
        }

        // start autoplay, call utils with no args = start from firstSlide
        settings.autoPlay && utils.play();

        return $accordion;

    };

})(jQuery);
