/*==================================================
	Rocket Pages show Widget
	By: Joshua Brickner (joshua@rocketjones.com)
	Copyright Rocket Jones Interactive 2008
==================================================*/

var Slideshow = function(imgs, captions, userSpeed, userFadeSpeed, userRandomize, userLoop, userID, instanceID) {
	var rotation;
	var imgIndex = 0;
	
	var show = {
		// These are set per slide show with instantiate. These are default values.
		guid: userID,
		speed: 3,
		fadeSpeed: 1,
		randomize: true,
		loop: true,
		nav: true,
		urls: new Array(),
		captions: new Array(),
		image: new Image(), // Image object to preload the images
		used: Array(), // An array of used images, keeps them from repeating
		instantiate: function(imgs, userSpeed, userFadeSpeed, userRandomize, userLoop) { // show sets up the show
			// Reset Defaults as provided
			if (imgs.length != 0) {
				show.foreach(imgs, function(img, value){
				 	show.urls.push(imgs[img]);
					show.captions.push(captions[img]);
				});
			}
			if (userSpeed != undefined) {
				show.speed = userSpeed;
			}
			if (userFadeSpeed != undefined) {
				show.fadeSpeed = userFadeSpeed;
			}
			if (userRandomize != undefined) {
				show.randomize = userRandomize;
			}
			if (userLoop != undefined) {
				show.loop = userLoop;
			}
					
			// Create markup for the show
			document.observe("dom:loaded", function() {
				var elementID = "placeholder" + instanceID;
				var container = document.getElementById(elementID).parentNode;
				var overlay = document.getElementById(elementID).cloneNode(false);

				overlay.style.position = "absolute";
				overlay.style.top = "0";
				overlay.style.right = "0";
				overlay.style.zIndex = "20";
			
				container.appendChild(overlay);
				
				$("side-slideshow-prev" + instanceID).observe("click", function(e) {
					e.stop();
					clearInterval(rotation);
					show.prev_image(document.getElementById(elementID), overlay);
				});
				
				$("side-slideshow-next" + instanceID).observe("click", function(e) {
					e.stop();
					clearInterval(rotation);
					show.next_image(document.getElementById(elementID), overlay);
				});
				
				show.rotate(document.getElementById(elementID), overlay); // Fires rotation method (see below)
			});
		},
		rotate: function(elem, elem2) {
			// show interval fires the rotation as necessary
			rotation = setInterval(function() {
				show.rotate_elements(elem, elem2);
			}, (show.speed * 1000)); // Converts speed into milliseconds, and sets the speed.
		},
		rotate_elements: function(elem, elem2) {
			imgIndex++;
		
			if (show.loop) { // Check if show should loop
				if (imgIndex > (show.urls.length - 1)) { // If it should loop reset the counter when it reaches it's end
					imgIndex = 0;
					show.used = null;
					show.used = Array();
				}
			} else {
				if (imgIndex == (show.urls.length - 1)) { // If show has reached its end clear the interval, stopping the show
					clearInterval(rotation);
				}
			}
			
			if (show.randomize) { // Check if show should be random
				// get random array item
				newSrc = show.urls[show.array_rand()];
				newCap = show.captions[show.array_rand()];
				show.foreach(show.urls, function(i, value){
				 	if (newSrc == show.urls[i]) {
						newCap = show.captions[i];
						show.used.push(i);
					}
				});
			} else {
				// If not random set to next array item
				newSrc = show.urls[imgIndex];
				newCap = show.captions[imgIndex];
			}
			
			// Change the source of the image using the determined array_item
			$(elem2).src = $(elem).src;
			$(elem2).show();
			$(elem).src = newSrc;
			show.fadeout(elem, elem2);
			
			document.getElementById("caption" + instanceID).innerHTML = newCap;
		},
		prev_image: function(elem, elem2) {
			imgIndex--;
	
			if (imgIndex <= -1) {
				if (show.loop == true)
					imgIndex = show.urls.length - 1;
				else
					imgIndex = 0;
			}
			
			var newSrc = show.urls[imgIndex];
			var newCap = show.captions[imgIndex];			
			
			$(elem).src = newSrc;
			
			document.getElementById("caption" + instanceID).innerHTML = newCap;
		
			if (imgIndex == 0)
				imgIndex = -1;
				
			show.rotate(elem, elem2);
		},
		next_image: function(elem, elem2) {
			imgIndex++;
	
			if (imgIndex > (show.urls.length - 1)) {
				if (show.loop == true)
					imgIndex = 0;
				else
					imgIndex = show.urls.length - 1;
			}
			
			var newSrc = show.urls[imgIndex];
			var newCap = show.captions[imgIndex];			
			
			$(elem).src = newSrc;
			
			document.getElementById("caption" + instanceID).innerHTML = newCap;
			
			show.rotate(elem, elem2);
		},
		array_rand: function() { // show returns a random array item.
			var result = false;
			while (!result) {
				option = Math.floor(Math.random() * show.urls.length);
				if (show.in_array(option, show.used)) {
					result = false;
				} else {
					result = true;
				}
			}
			return option;
		},
		in_array: function(obj, arr) { // show a copy of the PHP in_array function
			var k = 0;
			show.foreach(arr, function(m, value){
			 	if (arr[m] == obj) {
					k++;
				}
			});			
			if (k > 0) {
				return true;
			} else {
				return false;
			}
		},
		fadeout: function(elem, elem2) {
			$(elem2).fade({ duration: show.fadeSpeed, from: 1, to : 0 });
			$(elem).fade({ duration: show.fadeSpeed, from: 0, to : 1 });
		},
		sizeImage: function(imageObj) {
			var widthDiff = imageObj.width - 0;
			var heightDiff = imageObj.height - 0;
			if (widthDiff > heightDiff) {
				delta = "width";
			} else {
				delta = "height"
			}
			numerator = Math.floor((1 / (imageObj.width / imageObj.height)) * 100);
			denominator = 100;
			for (var i = 100; i >= 0; i--) {
				if ((numerator % i) == 0 && (denominator % i) == 0) {
					break;
				}
			}
			numerator = numerator % i;
			denominator = denominator % i;
			width = numerator - 0;
			height = denominator - 0;
			return new Array(width,height);
		},
		foreach: function (obj, callback){
		 var proto = obj.constructor.prototype,
		  h = obj.hasOwnProperty, key;
		 for(key in obj) {
		  if((h && h.call(obj,key)) || proto[key] !== obj[key])
		   callback(key, obj[key]);
		 }
		}
	};
	show.instantiate(imgs, userSpeed, userFadeSpeed, userRandomize, userLoop);
}
