(function ($) {
    "use strict";

    $.fn.horizontal_slideshow = function (opts_user) {
        var o = {
            'view_count': 1, // how many are displayed at once
            'id': 'horizontal_slideshow', // id prefix
            'animate_duration': 1000,
            'animate_easing': 'linear',
            'paging': 1,
            'item_index': 1, // starting index or item
            'item_selector': '> *', // to determine indexing
            'items': undefined, // if undefined, will use item_selector to get this
            'item_index_max': undefined, // how many entries are "off to the side" 
            'item_width': undefined,
            'viewer_width': undefined,
            'slider_padding': undefined,
            'slider_width': undefined
        };
        return this.each(function () {
            if (opts_user) {
                $.extend(o, opts_user);
            }
            var list = $(this),
                container = list.parent(),
                id = o['id'],
                gallery = $('<div id="' + id + '-gallery" />'),
                viewer = $('<div id="' + id + '-viewer" />'),
                slider = $('<div id="' + id + '-slider" />'),
                btn_left = $('<div class="' + id + '-btn" id="' + id + '-btn-left"><a>&nbsp;</a></div>'),
                btn_right = $('<div class="' + id + '-btn" id="' + id + '-btn-right"><a>&nbsp;</a></div>'),
                clear = $('<div style="clear: both;" />'),
                animate_duration = o['animate_duration'],
                animate_easing = o['animate_easing'],
                item_index = o['item_index'],
                view_count = o['view_count'],
                items_reference, items, 
                item_count, item_index_max,
                item_width, viewer_width,
                edge_count, remaining_index = 0,
                slider_padding, slider_width;

            items = o['items'] === undefined
                ? $(o['item_selector'], list)
                : o['items'];
            item_count = items.length;

            item_index_max = o['item_index_max'] === undefined
                ? item_count - o['view_count'] + 1
                : o['item_index_max'];
            item_width = o['item_width'] === undefined
                ? parseInt($(items[0]).outerWidth(true))
                : o['item_width'];
            viewer_width = o['viewer_width'] === undefined
                ? parseInt(container.css('width'))
                : o['viewer_width'];
            slider_padding = o['slider_padding'] === undefined
                ? (viewer_width - (item_width * o['view_count'])) / 2
                : o['slider_padding'];

            slider_width = o['slider_width'];
            if (slider_width === undefined)
            {
                slider_width = item_width * item_count;
                if (slider_padding > 0)
                {
                    slider_width += slider_padding;
                }
            }
            if (slider_padding > 0)
            {
                slider.css('marginLeft', slider_padding + 'px');
            }

            slider
                .css('width', slider_width)
                .append(this)
                .append(clear);
            viewer.append(slider);
            gallery
                .append(viewer)
                .prepend(btn_left)
                .prepend(btn_right);
            container.append(gallery);
            btn_left
                .click(function () {
                    var left = false, 
                        offset = item_index - 1,
                        paging = o['paging'];
                    if (slider.queue().length === 0)
                    {
                        if (offset >= paging)
                        {
                            offset = paging;
                        }
                        left = parseInt(slider.css('marginLeft')) + (item_width * offset);
                        item_index -= offset;
                    }
                    if (left !== false)
                    {
                        slider.
                            animate({
                                marginLeft: left + 'px'
                            }, animate_duration, animate_easing);
                    }
                });
            btn_right
                .click(function () {
                    var left = false,
                        paging = o['paging'],
                        offset = item_index_max - item_index,
                        remaining, needed, i;
                    if (item_index < item_index_max && slider.queue().length === 0) {
                        if (offset >= paging) {
                            offset = paging;
                        }
                        left = parseInt(slider.css('marginLeft')) - (item_width * offset);
                        item_index += offset;
                        slider.
                            animate({
                                'marginLeft': left + 'px'
                            }, animate_duration, animate_easing);
                    }
                });
            slider.
                css({
                    'marginLeft': parseInt(slider.css('marginLeft')) - (item_width * (item_index - 1)) + 'px'
                });
        });
    };

}(jQuery));

