/*
 * 	Easy Slider 2.0 - jQuery plugin
 *	written by Fernando Pedace
 *	based from 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
 *
 */
 
/*
 *	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($) {

	// shuffle snippet from http://yelotofu.com
	$.fn.shuffle = function() {
		return this.each(function(){
			var items = $(this).children().clone(true);
			return (items.length) ? $(this).html($.shuffle(items)) : this;
		});
	}
	
	$.shuffle = function(arr) {
		for(var j, x, i = arr.length; i; j = parseInt(Math.random() * i), x = arr[--i], arr[i] = arr[j], arr[j] = x);
		return arr;
	}

	$.fn.easySlider = function(options){
		var id = $(this).attr('id');


		// default configuration properties
		var defaults = {		
			Id: 			id,
			auto:			false,
			continuous:		false,
			vertical:		false,
			controlsShow:	true,
			controlsBefore:	'',
			controlsAfter:	'',	
			controlsFade:	true,
			firstClass: 	'firstBtn',
			firstText: 		'First',
			firstShow:		false,
			lastClass: 		'lastBtn',
			lastText: 		'Last',
			lastShow:		false,
			playClass: 		'playBtn',
			playText: 		'Play',
			pauseClass: 	'pauseBtn',
			pauseText: 		'Pause',
			playPause:		true,
			prevClass: 		'prevBtn',
			prevText: 		'Previous',
			nextClass: 		'nextBtn',	
			nextText: 		'Next',
			prevNext:		true,				
			speed: 			400,
            ease:           'swing',
			shuffle:		false,
			pause:			2000,
			numeric: 		false,
			link:			false
		}; 
		
		var options = $.extend(defaults, options);

		if (options.shuffle){
			$(this).children("ul").shuffle();
		}

						
		this.each(function() {
			var obj = $(this); 

            // Fix for nested list items
            var ul = obj.children("ul");
            var li = ul.children("li");

			obj.addClass("slider");
			holder = ' <div id="holder_'+options.Id+'" class="holder"></div>';
			$(obj).before(holder);
			$(obj).appendTo($("#holder_"+options.Id))

			obj.css('display', 'block');

			var s = $("li", obj).length;
			var w = $("li", obj).width(); 
			var h = $("li", obj).height(); 

			obj.width(w); 
			obj.height(h); 

            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+1)*w);
			
			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.vertical) $("li", obj).css('float','left');
								
			if(options.controlsShow){
				var html = options.controlsBefore;				
				if(options.numeric){
					html += '<div id="controls-pos_'+ options.Id +'"><ol id="controls_'+ options.Id +'" class="controls"></ol></div>';
				} 
				if(options.prevNext){
					html += ' <span id="prev_'+ options.Id +'" class="'+ options.prevClass +'"><a href=\"javascript:void(0);\">'+ options.prevText +'</a></span>';
					html += ' <span id="next_'+ options.Id +'" class="'+ options.nextClass +'"><a href=\"javascript:void(0);\">'+ options.nextText +'</a></span>';
				}				
				html += options.controlsAfter;						
				$(obj).after(html);	
			};

			if(options.playPause && options.auto){
				$('<li id="play_'+ options.Id +'" class="'+ options.playClass +'"><a href=\"javascript:void(0);\">'+ options.playText +'</a></li>').appendTo($("#controls_"+ options.Id))
				$('<li id="pause_'+ options.Id +'" class="'+ options.pauseClass +'"><a href=\"javascript:void(0);\">'+ options.pauseText +'</a></li>').appendTo($("#controls_"+ options.Id))
				$("a","#play_"+options.Id).width($("a","#pause_"+options.Id).width())
				$("a","#play_"+options.Id).click(function(){		
					animate("play",true);
					$("a","#play_"+options.Id).hide();
					$("a","#pause_"+options.Id).show();
				});	

				$("a","#pause_"+options.Id).click(function(){
					animate("pause",true);
					$("a","#pause_"+options.Id).hide();
					$("a","#play_"+options.Id).show();
				});
				$("a","#play_"+options.Id).hide();
			}

			if(options.firstShow){
				$('<li id="first_'+ options.Id +'" class="'+ options.firstClass +'"><a href=\"javascript:void(0);\">'+ options.firstText +'</a></li>').appendTo($("#controls_"+ options.Id))
				$("a","#first_"+options.Id).click(function(){		
					animate("first",true);
				});	
			}

			if(options.numeric){	
				for(var i=0;i<s;i++){	

					linkName = (options.link)? li.eq(i).attr('id') : (i+1) ;

					$(document.createElement("li"))
						.appendTo($("#controls_"+ options.Id))
						.attr('id','btn_'+options.Id + (i+1))
						.html('<a rel='+ i +' href=\"javascript:void(0);\">'+ linkName +'</a>')
						.click(function(){							
							animate($("a",$(this)).attr('rel'),true);
						}); 												
				};							
			} 

			if(options.prevNext){
				$("a","#next_"+options.Id).click(function(){		
					animate("next",true);
				});
				$("a","#prev_"+options.Id).click(function(){		
					animate("prev",true);		
				});	
			};
			
			if(options.lastShow){
				$('<li id="last_'+ options.Id +'" class="'+ options.lastClass +'"><a href=\"javascript:void(0);\">'+ options.lastText +'</a></li>').appendTo($("#controls_"+ options.Id))	
				$("a","#last_"+options.Id).click(function(){		
					animate("last",true);
				});	
			}

			
			function setCurrent(i){
				i = parseInt(i)+1;

				$("#controls_"+ options.Id).children("li").each(function() {
					$(this).removeClass('current');
				});
				$("li#btn_" + options.Id + 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.auto){
					timeout = setTimeout(function(){
						animate("next",true);
					},options.speed+options.pause);
				};
                if(options.numeric) setCurrent(t);

            };

			var status;

			if(options.auto){
				ul.hover(
					function(){
						clearTimeout(timeout);
					},
					function(){	
						if(options.auto){
							timeout = setTimeout(function(){
								animate("next",false);
							},options.pause);
						}
					}
			)};

			
			function animate(dir,clicked){
				status = dir;
				clearTimeout(timeout);
				if (clickable){
					clickable = false;
					var ot = t;	
					switch(dir){
						case "play":
							options.auto = true;
						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; 
						case "stop":
						case "pause":
							options.auto = false;
							t = t;
							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(t==ts || t<0){
						if(!options.continuous && options.controlsFade) $("a","#next_"+options.Id).hide();
						$("#last_"+options.Id).removeClass().addClass("disabled");
					} else {
						if(!options.continuous && options.controlsFade) $("a","#next_"+options.Id).show();
						$("#last_"+options.Id).removeClass().addClass(options.lastClass);					
					};
					if(t==0 || t>ts){
						if(!options.continuous && options.controlsFade) $("a","#prev_"+options.Id).hide();
						$("#first_"+options.Id).removeClass().addClass("disabled");
					} else {
						if(!options.continuous && options.controlsFade) $("a","#prev_"+options.Id).show();
						$("#first_"+options.Id).removeClass().addClass(options.firstClass);
					};					
						
			
				};
				
			};

			// 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","#prev_"+options.Id).hide();		
			};	
			$("#first_"+options.Id).removeClass().addClass("disabled");
			
		});
	  
	};

})(jQuery);
