(function($){  
 
	$.fn.codeslide = function(options) {  
 
		var defaults = { 
 
			speed:			500,
			leftarrow:		false,
			rightarrow:		false, 
			type:			'fade',
			autoplay:		true,
			startpage:		1,
			pageholder:		false,
			pageclass: 		'',
			pageactive: 	''
 
		};
 
		var current,
			page,
			timerspeed,
			interval,
			slider   	= $(this),
			sliderli 	= $('li',slider),
			options  	= $.extend(defaults, options),
			busy	 	= false,
			sliderlen 	= $(sliderli).size(),
			sliderwidth = $(sliderli).width();
 
		this.each(function(){	
		  
            if($(sliderli).length < 2)
                return false;
 
			if(interval != false)
				clearInterval(interval);	
 
			$(sliderli).show();
 
		    if(options.type == 'slide'){ // Code for sliding
 
		    	if(options.leftarrow)
		    		$(options.leftarrow).click(function(){ 	
 
						slideTo(page-1); 
						reset_autoplay();
 
					});
 
		    	if(options.rightarrow)
		    		$(options.rightarrow).click(function(){	
 
						slideTo(page+1); 
						reset_autoplay();
 
					});
 
		    	if(options.startpage > 0 && options.startpage <= sliderlen){
 
		    		if(options.startpage == 'last')
		    			page = sliderlen;
	    			else
	    				page = options.startpage
 
		    	}else
		    		page = 1;
 
		        slideTo(page);
 
		    }else if(options.type == 'fade'){ // Code for fading
 
		        $(sliderli).css({'position':	'absolute',
								 'left':		0});
				
				//Hiding all other slides
				$(sliderli).hide();
				$(sliderli).filter(':eq('+(current)+')').show();
				
 
		        $(options.leftarrow).click(function(){ 	
 
					fadeTo(current-1); 
					reset_autoplay();
 
				});
 
		        $(options.rightarrow).click(function(){ 
 
					fadeTo(current+1);  
					reset_autoplay();
 
				})
 
		        if(options.startpage > 0 && options.startpage <= sliderlen){
 
		            if(page == 'last')
		                page = sliderlen;  
					else
						page = options.startpage;      
 
		        }else
		            page = 1;
 
		        fadeTo(page);
 
		    }
 
		    // Pagination 
		    /////////////
 
		    if(options.pageholder != false)	    	  		
		  		if(sliderlen == 1)	  		
		  			$(options.pageholder).remove();
		  		else{
 
		  			var pagehtml = '';
 
			  		for(var i = 1;i <= sliderlen;i++)	  		
			  			pagehtml += '<a href="#" class="'+options.pageclass+'" data-page="'+i+'">';
 
		  			$(options.pageholder).html(pagehtml); 
		    		$(options.pageholder).find('.'+options.pageclass+'[data-page="'+current+'"]').addClass(options.pageactive);	 
					$(options.pageholder).find('.'+options.pageclass).click(function(e){
 
						e.preventDefault();
 
						if(current != $(this).data('page')){	
 
							if(options.type == 'fade')
								fadeTo($(this).data('page'));
							else
								slideTo($(this).data('page'));
 
							reset_autoplay();
 
						}
 
					});   	
 
				}		
 
		    // Autoplay
		    ///////////
 
		    if(options.autoplay != false && typeof options.autoplay != undefined){
 
		    	if(options.autoplay == parseInt(options.autoplay))
		   			timerspeed = parseInt(options.autoplay);
				else
					timerspeed = 5000; // Default 5 seconds
 
				reset_autoplay();			
 
		    }
 
		    function reset_autoplay(){
 
				if(options.autoplay){
 
					if(interval != false)
						clearInterval(interval);
 
					interval = setInterval(function() {
 
						if(options.type == 'slide')
							slideTo(page+1);
						else if(options.type == 'fade')
							fadeTo(current+1);
 
					}, timerspeed);
 
				}
 
			}
 
			current = page;
 
			// Code for fading
			//////////////////
 
			function fadeTo(page){
 
			    $(sliderli).stop(true,true);
 
			    if(page < 1)
			        page = sliderlen;
 
			    if(page > sliderlen)
			        page = 1;
 
			    $(sliderli).filter(':eq('+(page-1)+')').show().css('z-index',2);
			    $(sliderli).filter(':eq('+(current-1)+')').css('z-index',3).fadeOut(options.speed,function(){
				
			        $(sliderli).filter(':eq('+(page-1)+')').css('z-index',3);
 
			    });
 
			    current = page;
 
			    if(options.pageholder != false){
 
					$(options.pageholder).find('.'+options.pageclass).removeClass(options.pageactive);
			    	$(options.pageholder).find('.'+options.pageclass+'[data-page="'+current+'"]').addClass(options.pageactive);
 
			    }
 
			}
 
			// Code for sliding
			///////////////////
 
			function slideTo(page){
 
				$(function(){
 
					if(busy == false){
 
						busy = true;
 
						if(page == 'last')
							page = sliderlen;
 
						if(page != current)	{	
 
							if(page < current) // Slide to the right				
								if(!$(sliderli).css('left'))						  
									$(sliderli).animate({left:'-'+(sliderwidth * sliderlen)+'px'},options.speed,function(){ busy = false; });					
								else{
 
									var liPos = parseInt($(sliderli).css('left'));
 
									if(liPos < 0)					
										$(sliderli).animate({left:(liPos + sliderwidth) + 'px'},options.speed,function(){ busy = false; });					 
									else					
										$(sliderli).animate({left:'-'+(sliderwidth * (sliderlen-1))+'px'},options.speed,function(){ busy = false; });
 
								}				
							else // Slide to the left			
								if(!$(sliderli).css('left'))						  
									$(sliderli).animate({left:'-'+sliderwidth+'px'},options.speed,function(){ busy = false; });					
								else{
 
									var liPos = parseInt($(sliderli).css('left'));
 
									if(liPos > -(sliderwidth*(sliderlen-1)))					
										$(sliderli).animate({left:(liPos - sliderwidth) + 'px'},options.speed,function(){ busy = false; });					 
									else					
										$(sliderli).animate({left:0},options.speed,function(){ busy = false; });
 
								}
 
						}else
							busy = false;
 
					}
 
					if(options.pageholder != false){
 
						$(options.pageholder).find('.'+options.pageclass).removeClass(options.pageactive);
				    	$(options.pageholder).find('.'+options.pageclass+'[data-page="'+page+'"]').addClass(options.pageactive);
 
				    }
 
				});
 
			}
 
 		})
 
 	};
 
 ;
 
})(jQuery);
