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

var Slideshow = function(imgs, userSpeed, userFadeSpeed, userRandomize, userLoop, userID) {
	var show = {
		// These are set per slide show with instantiate. These are default values.
		guid: userID,
		speed: 3,
		fadeSpeed: 1,
		randomize: true,
		loop: true,
		urls: 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
			

			for (i=0;i<imgs.length;i++) {
				console.log(imgs[i]);
				objImage = new Image();
				objImage.src = imgs[i];
			}
			
			// Reset Defaults as provided
			if (imgs.length != 0) {
				show.foreach(imgs, function(img, value){
				 	show.urls.push(imgs[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.write('<div id="marker' + show.guid + '"></div>');  // A marker div that gives us a reference to where the show should go.
			var wrap = document.createElement("div"); // Creates the wrapper div for the show
			var elem = document.createElement("img"); // Creates the 'new' image tag
			var elem2 = document.createElement("img"); // Creates the 'old' image tag
			var parentElem = document.getElementById('marker' + show.guid); // Looks at our marker div for placement reference
			parentElem.parentNode.appendChild(wrap); // Physically appends div wrapper tag to the DOM
			wrap.appendChild(elem); // Physically appends img tag to the DOM
			wrap.appendChild(elem2); // Physically appends img tag to the DOM
		
			// setup basic styles for crossfade effect
			wrap.style.position = "relative";elem.style.position = "absolute";elem.style.top = "0";elem.style.left = "0";elem.style.zIndex = "2";elem.style.opacity = "0";elem.style.filter = "alpha(opacity=0);";elem2.style.position = "absolute";elem2.style.top = "0";elem2.style.left = "0";elem2.style.zIndex = "1";elem2.style.opacity = "0";elem2.style.filter = "alpha(opacity=0);";					
			for (x in show.urls) { // Loops through and preloads the remining images
				show.image.src = show.urls[x];
			}
			show.rotate(elem, elem2); // Fires rotation method (see below)
		},
		rotate: function(elem, elem2) {
			// show sets a counter variable to let us keep track of how many images have been shown
			var i = 0;
			// show interval fires the rotation as necessary
			var rotation = setInterval(function() {
				if (show.randomize) { // Check if show should be random
					// get random array item
					newSrc = show.urls[show.array_rand()];
					show.foreach(show.urls, function(i, value){
					 	if (newSrc == show.urls[i]) {
							show.used.push(i);
						}
					});
				} else {
					// If not random set to next array item
					newSrc = show.urls[i];
				}
				// Change the source of the image using the determined array_item
				//var dimensions = show.sizeImage(elem);
				//elem.style.width = dimensions[0] + "px";
				//elem.style.height = dimensions[1] + "px";
				show.fadein(elem, elem2);
				elem.style.opacity = 0;
				elem.style.filter = "alpha(opacity=0)";
				elem.src = newSrc;
			
																				
				if (show.loop) { // Check if show should loop
					if (i == (show.urls.length - 1)) { // If it should loop reset the counter when it reaches it's end
						i = -1;
						show.used = null;
						show.used = Array();
					}
				} else {
					if (i == (show.urls.length - 1)) { // If show has reached its end clear the interval, stopping the show
						clearInterval(rotation);
					}
				}
				// Increment our counter
				i++;
			}, (show.speed * 1000)); // Converts speed into milliseconds, and sets the speed.
		},
		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;
			}
		},
		fadein: function(elem, elem2) {
			d = 0;
			var fade = setInterval(function() {
				elem.style.opacity = (d / 100);
				elem.style.filter = "alpha(opacity=" + d + ")";
				if (d == 100) {
					//var dimensions = show.sizeImage(elem2);
					//elem2.style.width = dimensions[0] + "px";
					//elem2.style.height = dimensions[1] + "px";
					elem2.src = elem.src;
					elem2.style.opacity = 1.0;
					elem2.style.filter = "alpha(opacity=100)";
					clearInterval(fade);
				}
				d = d + 5;
			}, (show.fadeSpeed * 50));					
		},
		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);
}