(function(jQuery){
 jQuery.fn.slideshow = function(options) {
    
	var defaults = {
		slideDuration: 5000,					//in ms, time between slides
		fadeDuration: 'slow',					//in ms (or jQuery alias - e.g. slow, fast, etc) duration of fade 
		slidesClass: 'slideClass', 				//class of slides UL
		buttonsClass: 'slideButton',			//class of buttons UL
		captionClass: 'slideCaption',			//class of caption UL
		nextClass: 'nextClass',					//class of "next" button
		prevClass: 'prevClass',					//class of "prev" button
		pauseClass: 'pauseClass',				//class of "pause" button
		startClass: 'startClass',				//class of "start" button
		playPauseClass: 'playPauseSlides',		//class of "pause/play" toggle button
		reverseClass: 'reverseClass',			//class of "reverse" button
		showNav: 'mouseOver',					//diplay the navigation (mouseOver, true, false)
		topZIndex: 100,							//z-index of top slide
		stayOn: false,							//stay on a particular slide (e.g. 1,2,3) if false, slideshow automatically animates
		stopOnSelect: true,						//stop slideshow if user presses controls
		direction: 1,							//direction: 1 forward, -1 backward
		transitionType: 'crossFade',			//crossFade, crossWipe
		slideWidth:	'575px'						//it was either this or require the dimensions plugin
	};
  
	var options = jQuery.extend(defaults, options);
	var pass = 0;
    
  return this.each(function() {

		var curslide = 0;
		var prevslide = 0;	
		var num_slides = 0;
		var num_buttons = 0;
		var num_captions = 0;
		var slide_width = '0px';

		pass++;

		obj = jQuery(this);
		obj.data('slideshowed',true);
		
		var objId = obj.attr('id');
		slide_width = obj.find('.'+ options.slidesClass).eq(0).children('li').eq(0).outerWidth();	
		num_slides = obj.find('.'+ options.slidesClass).eq(0).children('li').length;

		var navWidth = (slide_width <= parseFloat(obj.css('width'))) ? parseFloat(obj.css('width')) : slide_width;

		var button_selector = '.'+options.buttonsClass+' li a:not(".' + options.nextClass + '.' + options.prevClass + '.' + options.pauseClass + '.' + options.startClass + '.' + '.' + options.playPauseClass + '.' + options.reverseClass + '")';
		num_buttons = obj.find(button_selector).length;		
		obj.find(button_selector).eq(0).addClass('selected');
		
		// select all captions. Set to display:none.
		var captions_selector = '.'+options.captionClass;
		//alert(obj.find(captions_selector).eq(0).children('li').eq(0).attr('type'));
		obj.find(captions_selector).each(function(){
			var i = -1;

			jQuery(this).children('li').each(function(){
				i++;
				jQuery(this).css('z-index',(options.topZIndex-i));
				if(i>0){
					jQuery(this).css('display','none');
				}
			});
		});

		// select all slide images. Set to display:none.
		obj.find('.'+ options.slidesClass).each(function(){
			var i = 0;

			jQuery(this).children('li').each(function(){
				i++;
				jQuery(this).css('z-index',(options.topZIndex-i));
				if(i>1){
					jQuery(this).css('display','none');
				}
			});
		});
		
		
		// Navigation Bar
		if(options.showNav != false){
			// setup the buttons area appearance and positioning
			var navBar = jQuery('.' + options.buttonsClass);
			navBar.css({'position':'absolute', 'bottom':0, 'left':0, 'z-index':options.topZIndex+2, 'width':navWidth, 'padding-left':0, 'padding-right':0, 'display':'block'});
			
			var navHeight = navBar.outerHeight();
			var capObj = jQuery(captions_selector + ' li');
			var capBottom = parseFloat(capObj.css('bottom'));
			capObj.animate({'bottom':capBottom/2+navHeight});
			// activate the navigation functionality - show/hide the navigation bar
			if (options.showNav == 'mouseOver') {
				var enterDelay;
				var leaveDelay;
				// show and hide the navigation once so the visitor knows it exists (and update caption position)
				capObj.animate({'bottom':capBottom/2+navHeight});
				setTimeout(function(){
					navBar.slideUp('fast');
					capObj.animate({'bottom':capBottom});
				},1500);
				// mouseover/out functionality
				obj.hover(function () {
					clearTimeout(leaveDelay);
					enterDelay = setTimeout(function(){
						capObj.animate({'bottom':capBottom/2+navHeight});
						navBar.slideDown();
					},375);
				  },function () {
					clearTimeout(enterDelay);
					leaveDelay = setTimeout(function(){
						navBar.slideUp('fast');
						capObj.animate({'bottom':capBottom});
					},600);
				 });
			}else {
				navBar.slideDown();
			}
		}
		
		if(options.stayOn){
			curslide = (options.stayOn-1);
			doSlide();
		} else {
			obj.everyTime(options.slideDuration, 'animateSlides'+pass, function(){
				moveSlide(options.direction,objId);
			});
		}		

		function moveSlide(direction,objId){
			jQuery('ul.debug').append('<li>moveSlide +  / ' + direction+'</li>');

			curslide = curslide + direction;
			prevslide = curslide - direction;
			switch(direction){
				case 1:
					if(curslide==num_slides){
						curslide = 0;
						prevslide = (num_slides - 1);
					}
					break;
				case -1:
					if(curslide<0){
						curslide = (num_slides - 1);
						prevslide = 0;
					}
					break;
			}
			
			doSlide(objId);
		}
			
		obj.find('.'+options.prevClass).click(function(){
			if(!$(this).hasClass('inactive')){
				obj.stopTime('animateSlides'+pass);
				moveSlide(-1,objId);	
			}
			return false;
		 });		
		obj.find('.'+options.nextClass).click(function(){
			if(!$(this).hasClass('inactive')){
				obj.stopTime('animateSlides'+pass);
				moveSlide(1,objId);		
			}
			return false;
		 });	
		obj.find('.'+options.pauseClass).click(function(){
			obj.stopTime('animateSlides'+pass);	
			return false;
		 });
		obj.find('.'+options.startClass).click(function(){
			obj.everyTime(options.slideDuration, 'animateSlides'+pass, function advanceSlide() {
				moveSlide(options.direction,objId);
			});
			return false;
		 });
		obj.find('.'+options.playPauseClass).click(function(){
			togglePlayPause(obj.find('.'+options.playPauseClass).attr('text'));
			return false;
		});
		
		obj.find('.'+options.reverseClass).click(function(){
			options.direction = (options.direction * (-1));	
			return false;
		});		
		
		obj.find(button_selector).click(function(){
			var thisObj = jQuery('#'+objId);
			if(options.stopOnSelect){
				obj.stopTime('animateSlides'+pass);
			}
			curslide = jQuery(thisObj.find(button_selector)).index(this);
			doSlide(objId);
			return false;
		});
		
		function togglePlayPause(currentState){
			if (currentState.toUpperCase() == 'PAUSE') {
				obj.stopTime('animateSlides'+pass);	
				obj.find('.'+options.playPauseClass).text('Play');
			} else {
				obj.everyTime(options.slideDuration, 'animateSlides'+pass, function advanceSlide() {
					moveSlide(options.direction,objId);
				});
				obj.find('.'+options.playPauseClass).text('Pause');
			}
			return false;
		}
		
		// position the caption horizontally centered
		function capPos(slide) {
			var captions_list = jQuery(captions_selector).children('li').eq(slide);
			var Pos = (navWidth/2) - (captions_list.width()/2) - (parseFloat(captions_list.css("margin-left"))+parseFloat(captions_list.css("margin-right")));
			captions_list.css({'left':Pos});
		}
		capPos(0);
		
		
		// Animate slides
		function doSlide(objId){
			var thisObj = jQuery('#'+objId);
			
			// update selected slide button
			thisObj.find('.'+options.buttonsClass+' li ' + '.selected').removeClass('selected');
			thisObj.find(button_selector).eq(curslide).addClass('selected');
			
			// display caption
			var captions_list = thisObj.find(captions_selector).children('li');
			if (captions_list.eq(curslide).attr('innerHTML') != ""){
				capPos(curslide);
				setTimeout(function(){captions_list.eq(curslide).fadeIn(options.fadeDuration*0.75);}, options.fadeDuration*0.75);
			}
			captions_list.not(captions_list.eq(curslide)).fadeOut(options.fadeDuration);
			
			// change slide
			thisObj.find('.'+ options.slidesClass).each(function(){
					switch(options.transitionType){
						case 'crossFade':
							jQuery(this).children('li').eq(curslide).animate({opacity:'show'},options.fadeDuration);
							jQuery(this).children('li').not(jQuery(this).children('li').eq(curslide)).animate({opacity:'hide'},options.fadeDuration);
							break;
						case 'crossWipe':
							if(curslide>prevslide){
								jQuery(this).children('li').eq(curslide).show();
								jQuery(this).children('li').eq(prevslide).animate({width:'0px'},options.fadeDuration,function(){
									$(this).css('display','none');
								});
							} else {
								
								jQuery(this).children('li').eq(curslide).animate({width:slide_width},options.fadeDuration,function(){
									//pass
								});
							}
							
							if(curslide==0){
								thisObj.find('.'+options.prevClass).addClass('inactive');
							} else {
								thisObj.find('.'+options.prevClass).removeClass('inactive');
							}
							
							if(curslide==(num_slides-1)){
								thisObj.find('.'+options.nextClass).addClass('inactive');
							} else {
								thisObj.find('.'+options.nextClass).removeClass('inactive');
							}							
							break;							
					}
					
					
			});
		}	
		

	
  });
 };
})(jQuery);


