/*
* jQuery liquid carousel v1.0
* http://www.nikolakis.net
*
* Copyright 2010, John Nikolakis
* Free to use under the GPL license.
* http://www.gnu.org/licenses/gpl.html
*
*/

(function ($) {
    $.fn.liquidcarousel = function (options) {

        var defaults = {
            height: 150,
            duration: 100,
            hidearrows: true
        };
        var options = $.extend(defaults, options);

        return this.each(function () {
            var divobj = $(this);

            $(divobj).height(options.height);
            $(divobj).css('overflow', 'hidden');

            $('> .wrapper', divobj).height(options.height);
            $('> .wrapper', divobj).css('overflow', 'hidden');
            $('> .wrapper', divobj).css('float', 'left');

            $('> .wrapper > ul', divobj).height(options.height);
            $('> .wrapper > ul', divobj).css('float', 'left');
            $('> .wrapper > ul', divobj).css('margin', '0');
            $('> .wrapper > ul', divobj).css('padding', '0');
            $('> .wrapper > ul', divobj).css('display', 'block');

            $('> .wrapper > ul > li', divobj).height(options.height);
            $('> .wrapper > ul > li', divobj).css('display', 'block');
            $('> .wrapper > ul > li', divobj).css('float', 'left');


            var originalmarginright = parseInt($('> .wrapper > ul > li', divobj).css('marginRight'));
            var originalmarginleft = parseInt($('> .wrapper > ul > li', divobj).css('marginLeft'));
            var visiblelis = 0;
            var totallis = $('> .wrapper > ul > li', this).length;
            var currentposition = 0;
            var liwidth = $('> .wrapper > ul > li:first', divobj).outerWidth(true);
            var additionalmargin = 0;
            var totalwidth = liwidth + additionalmargin;

            $(window).resize(function (e) {
                var divwidth = $(divobj).width();
                var availablewidth = (divwidth - $('> #previous', divobj).outerWidth(true) - $('> #next', divobj).outerWidth(true));

                previousvisiblelis = visiblelis;
                visiblelis = Math.floor((availablewidth / liwidth));

                if (visiblelis < totallis) {
                    additionalmargin = Math.floor((availablewidth - (visiblelis * liwidth)) / visiblelis);
                } else {
                    additionalmargin = Math.floor((availablewidth - (totallis * liwidth)) / totallis);
                }
                halfadditionalmargin = Math.floor(additionalmargin / 2);
                totalwidth = liwidth + additionalmargin;

                $('> .wrapper > ul > li', divobj).css('marginRight', originalmarginright + halfadditionalmargin);
                $('> .wrapper > ul > li', divobj).css('marginLeft', originalmarginleft + halfadditionalmargin);

                if (visiblelis > previousvisiblelis || totallis <= visiblelis) {
                    currentposition -= (visiblelis - previousvisiblelis);
                    if (currentposition < 0 || totallis <= visiblelis) {
                        currentposition = 0;
                    }
                }
                $('> .wrapper > ul', divobj).css('marginLeft', -(currentposition * totalwidth));

                if (visiblelis >= totallis || ((divwidth >= (totallis * liwidth)) && options.hidearrows)) {
                    if (options.hidearrows) {
                        $('> #previous', divobj).hide();
                        $('> #next', divobj).hide();

                        additionalmargin = Math.floor((divwidth - (totallis * liwidth)) / totallis);
                        halfadditionalmargin = Math.floor(additionalmargin / 2);
                        totalwidth = liwidth + additionalmargin;
                        $('> .wrapper > ul > li', divobj).css('marginRight', originalmarginright + halfadditionalmargin);
                        $('> .wrapper > ul > li', divobj).css('marginLeft', originalmarginleft + halfadditionalmargin);
                    }
                    $('> .wrapper', divobj).width(totallis * totalwidth);
                    $('> ul', divobj).width(totallis * totalwidth);
                    $('> .wrapper', divobj).css('marginLeft', 0);
                    currentposition = 0;
                } else {
                    $('> #previous', divobj).show();
                    $('> #next', divobj).show();
                    $('> .wrapper', divobj).width(visiblelis * totalwidth);
                    $('> ul', divobj).width(visiblelis * totalwidth);
                }
            });

            $('> #next', divobj).click(function () {

                if (totallis <= visiblelis) {
                    currentposition = 0;
                } else if ((currentposition + (visiblelis * 2)) < totallis) {
                    currentposition += visiblelis;
                }
                else if (currentposition == totallis - visiblelis) {
                    currentposition = 0;
                } else if ((currentposition + (visiblelis * 2)) >= totallis - 1) {
                    currentposition = totallis - visiblelis;
                }

                $('> .wrapper > ul', divobj).stop();
                $('> .wrapper > ul', divobj).animate({ 'marginLeft': -(currentposition * totalwidth) }, options.duration);
            });


            $('> .previous', divobj).click(function () {
                if ((currentposition - visiblelis) > 0) {
                    currentposition -= visiblelis;
                }
                else if (currentposition == 0) {
                    currentposition = totallis - visiblelis;
                } else if ((currentposition - (visiblelis * 2)) <= 0) {
                    currentposition = 0;
                }
                $('> .wrapper > ul', divobj).stop();
                $('> .wrapper > ul', divobj).animate({ 'marginLeft': -(currentposition * totalwidth) }, options.duration);
            });

            $('> #next', divobj).dblclick(function (e) {
                e.preventDefault();
                clearSelection();
            });

            $('> #previous', divobj).dblclick(function (e) {
                e.preventDefault();
                clearSelection();
            });

            function clearSelection() {
                if (document.selection && document.selection.empty) {
                    document.selection.empty();
                } else if (window.getSelection) {
                    var sel = window.getSelection();
                    sel.removeAllRanges();
                }
            }

            $(window).resize();
        });


    };
})(jQuery);

