//////////////////////////////////////////////////
// 	Slideshow.js
//	Copyright 2011. TopSoft Design Studio, LLC
//	
//	
//	This file may be altered, distributed and/or shared for personal use.
//	
//	Requirements:
//	Prototype.js - Version 1.6.0.3 + 
//	Scriptaculous.js - Version v1.8.2+
//	Utility.class.js - Version 1.5.6+
//
//




var Slideshow = {
			
	////////////////////////////////
	//	startShow
	//	
	//	This function is responsible for starting the show.
	//	This determines how many slides are availabe
	startShow: function(vars) 
	{		
		//	Setup local variables
		var slides = $$(vars["class"]);
		var duration = vars["duration"];
		var visible_slide = 0;
		var num_slides = slides.length;
		var intervalID;
		
		//	If no slides were found, quit
		if( num_slides <= 0 ) { return false; }
		
		//	If any slides are visible, hide them.
		for( var i = 0; i < num_slides; i++ ) {
			if( Utility.isVisible( slides[i] ) ) {
				visible_slide = i;
				$(slides[i]).hide();
			}
		}
		
		///////////////////////////////////////////////
		//	OBSERVE
		//	Setup Observe function for control items 
		//	such as Previous, Next, Slide Selectors and 
		//	Play/Pause items
		
		//	If Control items have been found
		//	Prev, Next, Etc
		if( vars["controller"].length > 0 )
		{		
			var control_objects = $$(vars["controller"]);
			var num_controllers = control_objects.length;
			
			//	Setup Observe functions for mouseover, mouseout and click
			//	for each controller
			for( i = 0; i < num_controllers; i++ ) {
				
				$(control_objects[i]).observe('mouseover', function(event)
				{
					if( vars["controllerHoverClass"].length > 0 ) 
						$(this).addClassName(vars["controllerHoverClass"]);									   
				});
				
				$(control_objects[i]).observe('mouseout', function(event)
				{
					if( vars["controllerHoverClass"].length > 0 )
						$(this).removeClassName(vars["controllerHoverClass"]);											   
				});
				
				$(control_objects[i]).observe('click', function(event) 
				{
				
					//	Get our direction based on 'rel' tag ( next or prev )
					var direction = $(this).readAttribute('rel');
					
					if( direction == "stop" ) {
						//	Stop current interval
						window.clearInterval( intervalID );
						return;
					}
					
					if( direction == "play" ) {
						//	Force next slide and reset current interval
						Slideshow.update(vars["class"], vars["duration"], vars["transition"]);
						intervalID = window.setInterval("Slideshow.update('"+vars["class"]+"', '"+vars["controller"]+"', '"+vars["selector"]+"', '"+vars["duration"]+"', '"+vars["transition"]+"')", vars["interval"]);
						return;
					}
										
					var slides = $$(vars["class"]);
					var duration = vars["duration"];
					var visible_slide;
					var num_slides = slides.length;
					
					if( num_slides <= 0 ) { return; }
					
					//	Scan to see if any slides are visible, if so, hide them.
					for( var i = 0; i < num_slides; i++ ) {
						if( Utility.isVisible( slides[i] ) ) {
							visible_slide = i;
						}
					}
					
					if( direction == "prev" ) {
						if( visible_slide == 0 )
							current_slide = num_slides-1;
						else
							current_slide = visible_slide - 1;
					}
					else if( direction == "next" ) {
						if(visible_slide == num_slides-1 )
							current_slide = 0;
						else
							current_slide = visible_slide + 1;
					}
					
					
					//	Select current slide item	
					var select_objects = $$(vars["selector"]);
					$(select_objects[current_slide]).addClassName("selected");
					$(select_objects[visible_slide]).removeClassName("selected");
					
					
					Slideshow.transition( vars["class"], current_slide, visible_slide, vars["transition"], vars["duration"], direction);						
					
					//	Stop current interval
					window.clearInterval( intervalID );
					
					//	Morph to next or previous slide
					intervalID = window.setInterval("Slideshow.update('"+vars["class"]+"', '"+vars["controller"]+"', '"+vars["selector"]+"', '"+vars["duration"]+"', '"+vars["transition"]+"')", vars["interval"]);
					
					  
				});	
			}
			
		}
		
		//	Setup Observe function for selector
		if( vars["selector"].length > 0 )
		{
		
			var control_objects = $$(vars["selector"]);
			var num_controllers = control_objects.length;

			//	
			for( i = 0; i < num_controllers; i++ ) {
				
				$(control_objects[i]).observe('mouseover', function(event)
				{
					$(this).addClassName(vars["selectorHoverClass"]);										   
				});
				
				$(control_objects[i]).observe('mouseout', function(event)
				{
					$(this).removeClassName(vars["selectorHoverClass"]);	
				});
				
				$(control_objects[i]).observe('click', function(event) 
				{
				
					//	Get our direction based on 'rel' tag ( next or prev )
					var selected_slide = $(this).readAttribute('rel')-1;
					
					var slides = $$(vars["class"]);
					var num_slides = slides.length;
					
					if( num_slides <= 0 ) { return; }
					
					//	Scan to see if any slides are visible, if so, hide them.
					for( var i = 0; i < num_slides; i++ ) {
						if( Utility.isVisible( slides[i] ) ) {
							visible_slide = i;
						}
					}
					
					if( selected_slide == visible_slide )
						return;
					
					//	Select current slide item	
					$(this).addClassName("selected");
					$(control_objects[visible_slide]).removeClassName("selected");
					
					Slideshow.transition( vars["class"], selected_slide, visible_slide, vars["transition"], vars["duration"]);
									
					//	Stop current interval
					window.clearInterval( intervalID );
					
					//	Morph to next or previous slide
					intervalID = window.setInterval("Slideshow.update('"+vars["class"]+"', '"+vars["controller"]+"', '"+vars["selector"]+"', '"+vars["duration"]+"', '"+vars["transition"]+"')", vars["interval"]);
					
					  
				});	
			}
			
		}
		
		//	Show first slide
		$(slides[0]).show();
		//Slideshow.update(vars["class"], vars["controller"], vars["selector"], vars["duration"], vars["transition"])
		//Slideshow.transition(vars["class"], 0, num_slides, vars["transition"], vars["duration"], "next");
		
		//	Select current slide item
		var control_objects = $$(vars["selector"]);
		if( control_objects.length > 0 ) {
		$(control_objects[0]).addClassName("selected"); }
		
		//	If auto is set to true, Start interval
		if( vars["auto"] == "true" )
			intervalID = window.setInterval("Slideshow.update('"+vars["class"]+"', '"+vars["controller"]+"', '"+vars["selector"]+"', '"+vars["duration"]+"', '"+vars["transition"]+"')", vars["interval"]);
		
		return intervalID;
	},
	
	////////////////////////////////
	//	Stop Show
	//	
	stopShow: function(intervalID) {
		
		window.clearInterval( intervalID );
	},

	////////////////////////////////
	//	
	//	
	update: function( slide_class, control_class, select_class, duration, transition ) {
		
		var slides = $$(slide_class);
		var num_slides = slides.length;
		var current_slide = 0;
		var previous_slide = 0;
		
		if( num_slides <= 0 ) { return };
		
		//	Determine which slide is visible
		for( var i = 0; i < num_slides; i++ ) {
			if( Utility.isVisible( slides[i] ) )
				current_slide = i;
		}
			
		if( current_slide >= num_slides-1 )
			current_slide = 0;
		else
			current_slide++;
			
		if( current_slide == 0 )
			previous_slide = num_slides-1;
		else
			previous_slide = current_slide-1;
		
		Slideshow.transition(slide_class, current_slide, previous_slide, transition, duration);
		
		//	Select current slide item
		var control_objects = $$(select_class);
		if( control_objects.length > 0 ) {
			$(control_objects[current_slide]).addClassName("selected");
			$(control_objects[previous_slide]).removeClassName("selected");
		}
		
	},
	
	////////////////////////////////
	//	
	//
	transition: function(slide_class, current_slide, previous_slide, default_transition, duration, direction) {
		
		var slides = $$(slide_class);
		
		var slide_transition =  $(slides[current_slide]).readAttribute("transition");
		
		if( slide_transition != null )
		   	default_transition = slide_transition;
		
		//	Switch Transition
		switch( default_transition )
		{
		default:
		case "appear":	
			//$(slides[current_slide]).setStyle({'top':'0px', 'left':'0px;'});
			//$(slides[previous_slide]).setStyle({'top':'0px', 'left':'0px;'});
			new Effect.Parallel([
				new Effect.Fade(slides[previous_slide], {sync:true}),
				new Effect.Appear(slides[current_slide], {sync:true})], { duration: duration });
			break;
		case "blinds":
			new Effect.Parallel([
				new Effect.BlindUp(slides[previous_slide], {sync:true}),
				new Effect.BlindDown(slides[current_slide], {sync:true})], { duration: duration });

			break;
		case "dropout":
			new Effect.Parallel([
				new Effect.DropOut(slides[previous_slide], {sync:false, duration: duration}),
				new Effect.Appear(slides[current_slide], {sync:true})], { duration: duration });
			break;
			
		case "slide":
			//	Slide current slide off the screen by it's width
			var slide_width = parseInt($(slides[current_slide]).getStyle("width"));
			
			//	Slide new slide in left to right if we are going to the next slide
			if( direction == "next" || current_slide > previous_slide )
			{
				$(slides[current_slide]).setStyle({'left':slide_width+'px'});
				$(slides[current_slide]).show();
					
				new Effect.Parallel([
					new Effect.Move(slides[previous_slide], {x:-slide_width, mode:'relative', sync:true}),
					new Effect.Fade(slides[previous_slide], {sync:true}),
					new Effect.Move(slides[current_slide], {x:-slide_width, mode:'relative', sync:true})], { duration: duration });
			}
			else
			{
				$(slides[current_slide]).setStyle({'left':'-'+slide_width+'px'});
				$(slides[current_slide]).show();
					
				new Effect.Parallel([
					new Effect.Move(slides[previous_slide], {x:slide_width, mode:'relative', sync:true}),
					new Effect.Fade(slides[previous_slide], {sync:true}),
					new Effect.Move(slides[current_slide], {x:slide_width, mode:'relative', sync:true})], { duration: duration });
			}
				
			new Effect.Fade(slides[previous_slide], { duration:.01, delay: duration });
			break;
		}
	}
};
