/*

 * 	Easy Slider 1.8 - jQuery plugin

 *	written by Alen Grakalic (modified by Kyle Florence - kyle.florence@gmail.com)

 *	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

 *

 */



/*

 *	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(options)

    {

        // default configuration properties

        var defaults = {

            prevId:         'prevBtn',

            prevText:       'Previous',

            nextId:         'nextBtn',

            nextText:       'Next',

            controlsShow:   true,

            controlsBefore: '',

            controlsAfter:  '',

            controlsFade:   true,

            insertAfter:    true,

            firstId:        'firstBtn',

            firstText:      'First',

            firstShow:      false,

            lastId:         'lastBtn',

            lastText:       'Last',

            lastShow:       false,

            vertical:       false,

            speed:          800,

            ease:           'swing',

            auto:           false,

            pause:          2000,

            continuous:     false,

            prevNext:       true,

            numeric:        false,

            numericId:      'controls'

        };



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



        this.each(function()

        {

            var obj = $(this);



            // Fix for nested list items

            var ul = obj.children("ul");

            var li = ul.children("li");



            var s = li.length;

            var w = obj.width();

            var h = obj.height();



            var t = 0;

            var ts = s-1;

            var clickable = true;



            // Set obj overflow to hidden

            obj.css("overflow","hidden");



            // Set width/height of list items based on width/height of obj

            li.each(function() {

               if(options.vertical) $(this).height(h);

                else $(this).width(w);

            });



            // Float items to the left

            li.css('float', 'left');



            // Set width/height of ul

            if(options.vertical) ul.height(s*w);

            else ul.width(s*h);



            // Clone elements for continuous scrolling

            if(options.continuous)

            {

                if(options.vertical)

                {

                    ul.prepend(li.filter(":last-child").clone().css("margin-top","-"+ h +"px"));

                    ul.append(li.filter(":nth-child(2)").clone());

                    ul.height((s+1)*h);

                } else {

                    ul.prepend(li.filter(":last-child").clone().css("margin-left","-"+ w +"px"));

                    ul.append(li.filter(":nth-child(2)").clone());

                    ul.width((s+1)*w);

                }

            };



            if(options.controlsShow)

            {

                var html = options.controlsBefore;

                if(options.numeric){

                    html += '<ol id="'+ options.numericId +'"></ol>';

                }

                if(options.firstShow) {

                    html += '<span id="'+ options.firstId +'"><a href="#">'+ options.firstText +'</a></span>';

                }

                if(options.prevNext){

                    html += '<span id="'+ options.prevId +'"><a href="#">'+ options.prevText +'</a></span>';

                    html += '<span id="'+ options.nextId +'"><a href="#">'+ options.nextText +'</a></span>';

                }

                if(options.lastShow) {

                    html += '<span id="'+ options.lastId +'"><a href="#">'+ options.lastText +'</a></span>';

                }

                html += options.controlsAfter;



                if (options.insertAfter) $(obj).after(html);

                else $(obj).before(html);

            };



            if(options.numeric)

            {

                for(var i=0;i<s;i++)

                {

                    $(document.createElement("li"))

                        .attr('id',options.numericId + (i+1))

                        .html('<a rel="'+ i +'" href="#"><span>'+ '<img src="/images/b' + (i+1) + 'txt.png" />' +'</span></a>')

                        .appendTo($("#"+ options.numericId))

                        .click(function(){

                            animate($("a",$(this)).attr('rel'),true);

                            return false;

                        });

                };

            }



            if(options.prevNext)

            {

                $("a","#"+options.nextId).click(function(){

                    animate("next",true); return false;

                });

                $("a","#"+options.prevId).click(function(){

                    animate("prev",true); return false;

                });

                $("a","#"+options.firstId).click(function(){

                    animate("first",true); return false;

                });

                $("a","#"+options.lastId).click(function(){

                    animate("last",true); return 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.css("margin-left",(t*w*-1));

                } else {

                    ul.css("margin-top",(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;

                        case "first":

                            t = 0;

                            break;

                        case "last":

                            t = ts;

                            break;

                        default:

                            t = parseInt(dir);

                            break;

                    };



                    var diff = Math.abs(ot-t);

                    var speed = diff*options.speed;

                    if(!options.vertical) {

                        p = (t*w*-1);

                        ul.animate(

                            { marginLeft: p },

                            {

                                queue:false,

                                duration:speed,

                                easing:options.ease,

                                complete:adjust

                            }

                        );

                    } else {

                        p = (t*h*-1);

                        ul.animate(

                            { marginTop: p },

                            {

                                queue:false,

                                duration:speed,

                                easing:options.ease,

                                complete:adjust

                            }

                        );

                    };



                    if(!options.continuous && options.controlsFade)

                    {

                        if(t==0){

                            $("a","#"+options.prevId).fadeOut('slow');

                            $("a","#"+options.firstId).fadeOut('slow');

                        } else if(t==ts){

                            $("a","#"+options.nextId).fadeOut('slow');

                            $("a","#"+options.lastId).fadeOut('slow');

                        } else {

                            $("a","#"+options.prevId).fadeIn('slow');

                            $("a","#"+options.firstId).fadeIn('slow');

                            $("a","#"+options.nextId).fadeIn('slow');

                            $("a","#"+options.lastId).fadeIn('slow');

                        };

                    };



                    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.numeric) setCurrent(0);



            if(!options.continuous && options.controlsFade){

                $("a","#"+options.prevId).hide();

                $("a","#"+options.firstId).hide();

            };



        });



    };

})(jQuery);
