$pb = {
	slideshowImages : new Array(100),

	init : function() {
		var anchors = $pb.getThumbnails();
		var urls = [];
		for(var i = 0; i < anchors.length; i++) {
			urls[i] = unescape($pb.util.parseParams(anchors[i].href).i);
		}
		$pb.preloadImages(urls);
		$pb.assignThumbnailAction();
		$pb.assignNavigationAction();
	},

	util : {
		addEvent : function(obj, type, evt) {
			if (obj.addEventListener) {
				obj.addEventListener(type, evt, false);
				
			} else if (obj.attachEvent) {
				obj.attachEvent("on"+type, evt);
			}
		},

		parseParams : function(url, cast) {
			var after_type_cast = {};
			var before_type_cast = {};
			var q = (url.indexOf("?") != -1 ? url.replace(/^[^\?]*/,'').substring(1) : url).replace(/\&$/,'').replace(/#[^\n]*/,'').split('&');

			for( var i = q.length - 1; i >= 0; i-- ) {
				var p = q[i].split('='), key = p[0], val = p[1];
				
				before_type_cast[key] = val;
				// convert floats
				if(/^[0-9.]+$/.test(val)) val = parseFloat(val);
				// convert booleans
				if(/^(true|false)$/.test(val)) val = (val == 'true');
				// ignore empty values
				if(val)	after_type_cast[key] = val;
			}
			return cast === false ? before_type_cast : after_type_cast;
		}
	},

	preloadImages : function(imgUrls, callback) {
		if(imgUrls != null && imgUrls.length>0){//loop array
			if($pb.slideshowImages.length < imgUrls.length) {
				var image = document.createElement("img")
				$pb.slideshowImages[$pb.slideshowImages.length] = image;
				$pb.util.addEvent(image, "load", function() {
					if($pb.slideshowImages.length < imgUrls.length) {
						$pb.preloadImages(imgUrls, callback);
					} else if(callback != undefined) {
						callback.call($pb.slideshowImages);
					}
				});
				image.setAttribute("src", imgUrls[$pb.slideshowImages.length-1]);
			}
		}
	},

	getThumbnails : function() {
		return document.getElementById("thumbnails").getElementsByTagName("a");
	},

	getPrevThumbnail : function() {
		var thumbnails = $pb.getThumbnails();
		var index = 0;
		
		for(index = 0; index < thumbnails.length; index++) {
			if(thumbnails[index].className.indexOf("selected") > -1) {
				break;
			}
		}
		
		index = (index == 0 ? thumbnails.length-1 : index-1);
		return thumbnails[index];
	},

	getNextThumbnail : function() {
		var thumbnails = $pb.getThumbnails();
		var index = 0;
		
		for(index = 0; index < thumbnails.length; index++) {
			if(thumbnails[index].className.indexOf("selected") > -1) {
				break;
			}
		}
		
		index = (index == thumbnails.length-1 ? 0 : index+1);
		return thumbnails[index];
	},
	
	loadNewImage : function() {
		var params = $pb.util.parseParams(this.href);
		var bigImage = document.getElementById("medium");
		var currentThumb = document.getElementById("currentThumb");
		var thumbnails = $pb.getThumbnails();
		var selectedThumbnail = null;
		
		for(var i = 0; i < thumbnails.length; i++) {
			if(thumbnails[i].className.indexOf("selected") > -1) {
				selectedThumbnail = thumbnails[i];
				break;
			}
		}
		
		//create new image
		var newImage = document.createElement("img");
		$pb.util.addEvent(newImage, "load", function() {
			//when new image loads, replace the old image with the new one
			bigImage.setAttribute("src", newImage.getAttribute("src"));
		});
		newImage.setAttribute("src", unescape(params.i));
		newImage.setAttribute("id", "medium");
		
		//clear selected from old thumbnail and add selected to new thumbnail
		selectedThumbnail.className = "";		
		this.className = "selected";
		currentThumb.className = "tc"+params.tc;
	},

	assignNavigationAction : function() {
		var leftArrow = document.getElementById("leftArrow").parentNode;
		var rightArrow = document.getElementById("rightArrow").parentNode;
		
		$pb.util.addEvent(leftArrow, "click", function(event) {
			event = (event == null ? window.event : event);
			$pb.loadNewImage.call($pb.getPrevThumbnail());
			if(event && event.preventDefault) {
				event.preventDefault();
			} else {
				return false;
			}
		});

		$pb.util.addEvent(rightArrow, "click", function(event) {
			event = (event == null ? window.event : event);
			$pb.loadNewImage.call($pb.getNextThumbnail());
			if(event && event.preventDefault) {
				event.preventDefault();
			} else {
				return false;
			}
		});
	},
	
	assignThumbnailAction : function() {
		var thumbnails = $pb.getThumbnails();
		for(var i = 0; i < thumbnails.length; i++) {
			thumbnails[i].onclick = function(event) {
				$pb.loadNewImage.call(this);
				return false;
			}	
		}
	}
}

$pb.util.addEvent(window, "load", $pb.init);
