(function($) {

    $.fn.easySlider = function(options){

        // default configuration properties
        var defaults = {
            prevId:         'prevBtn',
            nextId:         'nextBtn',
            controlsShow:   true,
            controlsFade:   true,
            vertical:       false,
            speed:          800,
            auto:           false,
            pause:          2000,
            continuous:     false,

            navBtnImg: "/home/img/sliderButtons.png",
            navBtnHeight: 34,
            navBtnWidth: 34,
            navBtnIndent: 10,
            height: 208,
            width: 370
        };

        var options = $.extend(defaults, options);

        this.each(function() {
            var obj = $(this);
            var s = $("li", obj).length;
            var w = options.width;
            var h = options.height;
            obj.width(w);
            obj.height(h);
            obj.css({overflow: "hidden", position: "absolute"});
            var ts = s-1;
            var t = 0;
            $("ul", obj).css({listStyle: "none", margin: 0, padding: 0, width: s * w});
            if(!options.vertical) $("li", obj).css('float','left');

            var btnImgObj = new Object();
            if(options.controlsShow) {
                var html = "";
                html += " <div id='" + options.prevId + "'></div>";
                html += " <div id='" + options.nextId + "'></div>";
                $(obj).after(html);
                $("#" + options.prevId + ", #" + options.nextId).css({
                    background: "url(" + options.navBtnImg + ")",
                    cursor: "pointer",
                    height: options.navBtnHeight,
                    position: "relative",
                    width: options.navBtnWidth
                });
                $("#" + options.prevId).css({
                    left: 0+options.navBtnIndent,
                    marginBottom: -options.navBtnHeight,
                    top: (h-options.navBtnHeight)/2
                })
                $("#" + options.nextId).css({
                    left: w-options.navBtnWidth-options.navBtnIndent,
                    backgroundPosition: "top right",
                    top: (h-options.navBtnHeight)/2
                })
            };

            $("#" + options.nextId).click(function() {
                animate("next", true);
            });
            $("#" + options.nextId).hover(
                    function() {
                        $("#" + options.nextId).css({backgroundPosition: "bottom right"});
                    }, function() {
                        $("#" + options.nextId).css({backgroundPosition: "top right"});
                    });
            $("#" + options.prevId).click(function() {
                animate("prev", true);
            });
            $("#" + options.prevId).hover(
                    function() {
                        $("#" + options.prevId).css({backgroundPosition: "bottom left"});
                    }, function() {
                        $("#" + options.prevId).css({backgroundPosition: "top left"});
                    });

            function animate(dir,clicked) {
                var ot = t;
                switch(dir) {
                    case "next":
                        t = (ot>=ts) ? (options.continuous ? 0 : ts) : t+1;
                        break;
                    case "prev":
                        t = (t<=0) ? (options.continuous ? ts : 0) : t-1;
                        break;
                    case "first":
                        t = 0;
                        break;
                    case "last":
                        t = ts;
                        break;
                    default:
                        break;
                };

                var diff = Math.abs(ot - t);
                var speed = diff * options.speed;
                if(!options.vertical) {
                    p = (t * w * -1);
                    $("ul", obj).animate({
                        marginLeft: p
                    }, speed);
                } else {
                    p = (t * h * -1);
                    $("ul", obj).animate({
                        marginTop: p
                    }, speed);
                };

                if(!options.continuous && options.controlsFade) {
                    if(t == ts) {
                        $("#" + options.nextId).hide();
                    } else {
                        $("#" + options.nextId).show();
                    };
                    if(t == 0) {
                        $("#" + options.prevId).hide();
                    } else {
                        $("#" + options.prevId).show();
                    };
                };

                if(clicked) clearTimeout(timeout);
                if(options.auto && dir=="next" && !clicked) {
                    timeout = setTimeout(function() {
                        animate("next", false);
                    }, diff * options.speed + options.pause);
                };

            };

            // Init
            var timeout;
            if(options.auto) {
                timeout = setTimeout(function() {
                    animate("next", false);
                }, options.pause);
            };

            if(!options.continuous && options.controlsFade) {
                $("#" + options.prevId).hide();
            };
        });
    };
})(jQuery);
