/*
 * 	Easy Slider 1.7 - jQuery plugin
 *	written by Alen Grakalic	
 *	http://cssglobe.com/post/4004/easy-slider-15-the-easiest-jquery-plugin-for-sliding
 *
 *	Copyright (c) 2009 Alen Grakalic (http://cssglobe.com)
 *	Dual licensed under the MIT (MIT-LICENSE.txt)
 *	and GPL (GPL-LICENSE.txt) licenses.
 *
 *	Built for jQuery library
 *	http://jquery.com
 *
 *  Modified by: Robert McKee
 *  Date: 10/7/2011
 */
 
/*
 *	markup example for $("#slider").easySlider();
 *	
 * 	<div id="slider">
 *		<ul>
 *			<li><img src="images/01.jpg" alt="" /></li>
 *			<li><img src="images/02.jpg" alt="" /></li>
 *			<li><img src="images/03.jpg" alt="" /></li>
 *			<li><img src="images/04.jpg" alt="" /></li>
 *			<li><img src="images/05.jpg" alt="" /></li>
 *		</ul>
 *	</div>
 *
 */

(function ($) {
    $.fn.easySlider = function (opt) {
        // default configuration properties
        var defaults = {
            prevShow: true,
            prevClass: 'sliderPrev',
            prevText: 'Previous',
            nextShow: true,
            nextClass: 'sliderNext',
            nextText: 'Next',
            controlsShow: true,
            controlsBefore: '',
            controlsAfter: '',
            controlsFade: true,
            controlsClass: 'sliderControls',
            firstClass: 'sliderFirst',
            firstText: 'First',
            firstShow: false,
            lastClass: 'sliderLast',
            lastText: 'Last',
            lastShow: false,
            vertical: false,
            speed: 800,
            auto: false,
            pause: 2000,
            continuous: false,
            numericShow: false,
            numericClass: 'controls',
            pagedisplayShow: true,
            pagedisplayClass: 'pagertext',
            pagedisplayText: '(PAGE $c of $t)',
            onSlidingOut: function () { },
            onSlidOut: function () { },
            onSlidingIn: function () { },
            onSlidIn: function () { },
            onPause: function () { },
            onResume: function () { }
        };

        var options = $.extend(defaults, opt);

        this.each(function () {
            var obj = $(this);
            var s = $("li", obj).length;
            var h = $("li", obj).height();
            var clickable = true;
            obj.height(h);
            obj.css("overflow", "hidden");
            var ts = s - 1;
            var t = 0;


            if (!options.vertical) $("li", obj).css('float', 'left');
            var w = $("li", obj).innerWidth();
            obj.width(w);
            $("ul", obj).css('width', s * w);

            if (options.continuous) {
                $("ul", obj).prepend($("ul li:last-child", obj).clone().css("margin-left", "-" + w + "px"));
                $("ul", obj).append($("ul li:nth-child(2)", obj).clone());
                $("ul", obj).css('width', (s + 1) * w);
            };

            if (options.controlsShow) {
                var html = options.controlsBefore;
                if (options.numericShow) html += '<ol class="' + options.numericClass + '"></ol>';
                if (options.firstShow) html += '<span class="' + options.firstClass + '"><a href=\"javascript:void(0);\">' + options.firstText + '</a></span>';
                if (options.prevShow) html += ' <span class="' + options.prevClass + '"><a href=\"javascript:void(0);\">' + options.prevText + '</a></span>';
                if (options.pagedisplayShow) html += ' <span class="' + options.pagedisplayClass + '">' + options.pagedisplayText.replace('$c', (t + 1)).replace('$t', (ts + 1)) + '</span>';
                if (options.nextShow) html += ' <span class="' + options.nextClass + '"><a href=\"javascript:void(0);\">' + options.nextText + '</a></span>';
                if (options.lastShow) html += ' <span class="' + options.lastClass + '"><a href=\"javascript:void(0);\">' + options.lastText + '</a></span>';
                html += options.controlsAfter;
                $("." + options.controlsClass).html(html);
            };

            if (options.numericShow) {
                for (var i = 0; i < s; i++) {
                    $(document.createElement("li"))
						.html('<a href=\"javascript:void(0);\">' + (i + 1) + '</a>')
						.appendTo($("." + options.numericClass))
						.click(function () {
						    animate($(this).prevAll().length, true);
						});
                };
            };
            $("." + options.nextClass).click(function () {
                animate("next", true);
            });
            $("." + options.prevClass).click(function () {
                animate("prev", true);
            });
            $("." + options.firstClass).click(function () {
                animate("first", true);
            });
            $("." + options.lastClass).click(function () {
                animate("last", true);
            });

            function setCurrent(x) {
                x = parseInt(x);
                $("li.current", obj).removeClass("current");
                if (options.continuous)
                    x = x + 1;
                $("li", obj).eq(x).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));
                }
                $("span." + options.pagedisplayClass).html(options.pagedisplayText.replace('$c', (t + 1)).replace('$t', (ts + 1)));
                options.onSlidOut($("li.current", obj).prevAll().length + (options.continuous ? 0 : 1));
                //if (options.numericShow) 
                setCurrent(t);
                options.onSlidIn($("li.current", obj).prevAll().length + (options.continuous ? 0 : 1));
                clickable = true;
            };

            function fade() {
                if (!options.continuous && options.controlsFade) {
                    if (t == ts) {
                        $("." + options.nextClass + ":visible").fadeOut();
                        $("." + options.lastClass + ":visible").fadeOut();
                    } else {
                        $("." + options.nextClass + ":hidden").fadeIn();
                        $("." + options.lastClass + ":hidden").fadeIn();
                    };
                    if (t == 0) {
                        $("." + options.prevClass + ":visible").fadeOut();
                        $("." + options.firstClass + ":visible").fadeOut();
                    } else {
                        $("." + options.prevClass + ":hidden").fadeIn();
                        $("." + options.firstClass + ":hidden").fadeIn();
                    };
                    if (ts == 0) {
                        $("." + options.pagedisplayClass).hide();
                    } else {
                        $("." + options.pagedisplayClass).show();
                    }
                };
            }

            function animate(dir, clicked) {
                if (clickable) {
                    clickable = false;
                    var ot = t;
                    //var ts = $("li", obj).length - 1;
                    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;
                        case "first":
                            t = 0;
                            break;
                        case "last":
                            t = ts;
                            break;
                        default:
                            t = dir;
                            break;
                    };

                    if (ot == t) {
                        clickable = true;
                        return;
                    }

                    var ret = options.onSlidingOut($("li.current", obj).prevAll().length + (options.continuous ? 0 : 1));
                    if (ret === false) {
                        t = ot;
                        clickable = true;
                        return;
                    }

                    var nxt = t;
                    if (t > ts) nxt = 0;
                    if (t < 0) nxt = ts;
                    ret = options.onSlidingIn(nxt + 1);
                    if (ret === false) {
                        t = ot;
                        clickable = true;
                        return;
                    }

                    var diff = Math.abs(ot - t);
                    var speed = diff * options.speed;
                    if (!options.vertical) {
                        var vp = (t * w * -1);
                        $("ul", obj).animate(
							{ marginLeft: vp },
							{ queue: false, duration: speed, complete: adjust }
						);
                    } else {
                        var hp = (t * h * -1);
                        $("ul", obj).animate(
							{ marginTop: hp },
							{ queue: false, duration: speed, complete: adjust }
						);
                    };

                    fade();

                    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.numericShow)
            options.onSlidingIn(1);
            fade();
            setCurrent(0);
            options.onSlidIn($("li.current", obj).prevAll().length + (options.continuous ? 0 : 1));
        });
    };
})(jQuery);




