
$.fn.Slider = function(options) {
    // default configuration properties

    options = $.extend({
        prevId: 'prevBtn',
        prevText: 'Previous',
        nextId: 'nextBtn',
        nextText: 'Next',
        controlsBefore: '',
        controlsAfter: '',
        controlsFade: true,
        vertical: false,
        speed: 800,
        auto: false,
        pause: 2000,
        continuous: false,
        overStop: false,
        numeric: false,
        numericId: 'controls',
        rollingWidth: 0,
        rollingHeight: 0,        
        slideBy: 1,
        viewCount: 4
    }, options);

    return this.each(function() {
        var obj = $(this);
        var clickable = true;
        var s = $("li", obj).length;
        var w = options.rollingWidth;
        var h = options.rollingHeight;
        var ts = s - 1;
        var t = 0;

        if (s > options.slideBy) {
            if (!options.vertical) {
                obj.css('width', w * s);
                obj.css('height', h);
            } else {
                obj.css('width', w);
                obj.css('height', h * s);
            }

            obj.css("position", "relative");
            obj.css("overflow", "hidden");

            if (options.continuous) {
                //                var j = 1;
                //                for (var i = s - 1; i > options.viewCount; i--) {                    
                //                    $("ul", obj).prepend($("ul li:eq(" + i + ")", obj).clone());
                //                    j++;
                //                }                             

                for (var i = 0; i < options.viewCount; i++) {
                    $("ul", obj).append($("ul li:eq(" + i + ")", obj).clone());
                }

                $("ul", obj).css('width', (s + options.viewCount) * w);
            };

            if (!options.vertical) $("li", obj).css('float', 'left');

            if (options.numeric) {
                for (var i = 0; i < s; i++) {
                    $(document.createElement("li"))
						.attr('id', options.numericId + (i + 1))
						.html('<a rel=' + i + ' href=\"javascript:void(0);\">' + (i + 1) + '</a>')
						.appendTo($("#" + options.numericId))
						.click(function() {
						    animate($("a", $(this)).attr('rel'), true);
						});
                };
            } else {
                $("#" + options.nextId).click(function() {
                    animate("next", false);
                });
                $("#" + options.prevId).click(function() {
                    animate("prev", false);
                });
            };

            function setCurrent(i) {
                i = parseInt(i) + 1;
                $("li", "#" + options.numericId).removeClass("current");
                $("li#" + options.numericId + i).addClass("current");
            };

            function adjust() {
                if (t > ts) t = 0;
                if (t < 0) t = ts;
                if (!options.vertical) {                    
                    $("ul", obj).css("margin-left", (t * w * -1));
                } else {
                    $("ul", obj).css("margin-left", (t * h * -1));
                }
                clickable = true;
                if (options.numeric) setCurrent(t);
            };

            function animate(dir, clicked) {
                if (clickable) {
                    clickable = false;
                    var ot = t;
                    switch (dir) {
                        case "next":
                            t = (ot >= ts) ? (options.continuous ? t + 1 : ts) : t + 1;
                            break;
                        case "prev":
                            t = (t <= 0) ? (options.continuous ? t - 1 : 0) : t - 1;
                            break;
                        default:
                            t = dir;
                            break;
                    };
                    var diff = Math.abs(ot - t);
                    var speed = diff * options.speed;
                    if (!options.vertical) {
                        p = (t * w * -1);                            
                        $("ul", obj).animate(
							{ marginLeft: p },
							{ queue: false, duration: speed, complete: adjust }
						);
                    } else {
                        p = (t * h * -1);
                        $("ul", obj).animate(
							{ marginTop: p },
							{ queue: false, duration: speed, complete: adjust }
						);
                    };

                    if (!options.continuous && options.controlsFade) {
                        if (t == ts) {
                            $("#" + options.nextId).hide();
                            $("#" + options.lastId).hide();
                        } else {
                            $("#" + options.nextId).show();
                            $("#" + options.lastId).show();
                        };
                        if (t == 0) {
                            $("#" + options.prevId).hide();
                            $("#" + options.firstId).hide();
                        } else {
                            $("#" + options.prevId).show();
                            $("#" + options.firstId).show();
                        };
                    };

                    if (clicked) clearTimeout(timeout);
                    if (options.auto && !clicked) {
                        timeout = setTimeout(function() {
                            animate("next", false);
                        }, options.pause);
                    };

                };

            };
            // init
            var timeout;
            if (options.auto) {
                timeout = setTimeout(function() {
                    animate("next", false);
                }, options.pause);
            };

            if (options.overStop) {
                obj.bind("mouseover", function() {
                    clearTimeout(timeout);
                });

                obj.bind("mouseout", function() {
                    timeout = setTimeout(function() {
                        animate("next", false);
                    }, options.pause);
                });
            }

            if (options.numeric) setCurrent(0);

            if (!options.continuous && options.controlsFade) {
                $("#" + options.prevId).hide();
                $("#" + options.firstId).hide();
            };
        }
    });
};






