
(function ($) {
    $.fn.easySlider = function (options) {
        var defaults = { nextId: 'nextBtn', prevId: 'prevBtn', nextText: '', prevText: '', autogeneratePagination: false, orientation: '', speed: 1000, autoplayDuration: 0, restartDuration: 2500, loop: false, hoverPause: 0, hover: false, easing: null, pauseable: false, pauseButtons: false, beforeTransition: null, afterTransition: null }; var options = $.extend(defaults, options); return this.each(function () {
            var obj = $(this), totalSlides = $("li", obj).length, slideWidth = obj.width(), slideHeight = obj.height(), lastSlide = totalSlides - 1, current = 0; var vertical = (options.orientation == 'vertical'), fade = (options.orientation == 'fade'), horizontal = (!vertical && !fade), autogen = options.autogeneratePagination, pauseable = options.pauseable, loop = options.loop, speed = options.speed, easing = options.easing, hover = options.hover, hoverPause = options.hoverPause, buttonsPause = options.pauseButtons, restartDuration = options.restartDuration, autoplayDuration = Math.max(options.autoplayDuration, 25) + speed, autoplay = (options.autoplayDuration > 0), beforeTransition = options.beforeTransition, afterTransition = options.afterTransition; interval = null, restart = null; if (autogen) { $(obj).after('<span id="' + options.nextId + '"><a href=\"javascript:void(0);\">' + options.nextText + '</a></span> ' + '<span id="' + options.prevId + '"><a href=\"javascript:void(0);\">' + options.prevText + '</a></span>'); }
            var $ul = $("ul", obj), $prev = $("#" + options.prevId), $next = $("#" + options.nextId); if (loop) { $ul.append($("li:first", obj).clone()); totalSlides += 1; lastSlide += 1; }
            if (horizontal) { $("li", obj).css('float', 'left'); $ul.css('width', totalSlides * slideWidth); }
            if (fade) { $ul.find("li:not(:first)").hide(); }
            var pauseFunc = function () { clearInterval(interval); clearTimeout(restart); }
            var restartFunc = function () { restart = setTimeout(function () { interval = setInterval(auto, autoplayDuration); }, restartDuration); }; if (pauseable && autoplay) { $(obj).hover(pauseFunc, restartFunc); if (buttonsPause) { $prev.hover(pauseFunc, restartFunc); $next.hover(pauseFunc, restartFunc); } }
            if (!hover) {
                $prev.click(function () { if (autoplay) { pauseFunc(); if (!buttonsPause) { restartFunc(); } }; animate("prev"); });
                $next.click(function () { if (autoplay) { pauseFunc(); if (!buttonsPause) { restartFunc(); } }; animate("next"); });
            }
            else {
                var hoverprev = false, hovernext = false, isAnimating = false; $prev.hover(function () { var tfunc = arguments.callee; hoverprev = true; if (!isAnimating) { isAnimating = true; animate("prev", function () { isAnimating = false; if (hoverprev) { tfunc(); } }); } }, function () { hoverprev = false; }); 
             $next.hover(function () { var tfunc = arguments.callee; hovernext = true; if (!isAnimating) { isAnimating = true; animate("next", function () { isAnimating = false; if (hovernext) { tfunc(); } }); } }, function () { hovernext = false; }); }
            function animate(dir, cb) {
                if (beforeTransition) { beforeTransition(current, $ul.find('li:eq(' + current + ')'), $ul); }
                var newcb = function () {
                    if (cb != null) { (hoverPause == 0) ? cb() : setTimeout(cb, hoverPause); }
                    if (afterTransition) { afterTransition(current, $ul.find('li:eq(' + current + ')'), $ul); } 
                }
                var cur = current; if (loop) {
                                                if (dir == 'prev') { current = (current == lastSlide) ? 1 : current + 1; }
                                                else { current = (current == 0) ? lastSlide - 1 : current - 1; } 
                                            }
                                            else {
                                                if (dir == "prev") { current = (current >= lastSlide) ? lastSlide : current + 1; }
                                                else { current = (current <= 0) ? 0 : current - 1; } 
                                             }
                  var nex = current; if (loop) {
                                                if ((dir == "prev") && (cur == lastSlide)) { (vertical) ? $ul.animate({ marginTop: 0 }, -1) : $ul.animate({ marginLeft: 0 }, -1); }
                                                else if ((dir == "next") && (cur == 0)) { (vertical) ? $ul.animate({ marginTop: (totalSlides - 1) * slideHeight * -1 }, -1) : $ul.animate({ marginLeft: (totalSlides - 1) * slideWidth * -1 }, -1); } 
                 }
                                            if (horizontal) { $ul.animate({ marginLeft: (nex * slideWidth * -1) }, speed, easing, newcb); }
                                            else if (vertical) { $ul.animate({ marginTop: (nex * slideHeight * -1) }, speed, easing, newcb); } 
                else { var curli = 'li:eq(' + cur + ')'; var nexli = 'li:eq(' + nex + ')'; $ul.find(curli).fadeOut("slow", function () { $ul.find(nexli).fadeIn("slow", newcb); }); }
                if (!loop) { if (nex <= 0) { $next.fadeOut(); } else if (nex >= lastSlide) { $prev.fadeOut(); } else { $prev.fadeIn(); $next.fadeIn(); } } 
            }; if (autoplay) {
                var auto = function () { animate('next'); if (!loop && current >= lastSlide) { clearInterval(interval); } }
                restart = setTimeout(function () { auto(); interval = setInterval(auto, autoplayDuration); }, autoplayDuration - speed);
            }
            $prev.hide(); $next.hide(); if (totalSlides > 1) { $prev.fadeIn(); if (loop) { $next.fadeIn(); } } 
        });
    };
})(jQuery);
