// global callback variable
var ST_callback;

function ST() {
	this.Carousel = function() {
		var imageIds = new Array();
		var currentImage = 0;
		var totalImages = 0;

		this.Initialize = function() {
			// deprecated
		}

		this.Rotate = function(direction) {
			if ((direction == "+") || (direction == "1")) {
				currentImage++;
				if (currentImage > totalImages) {
					currentImage = 0;
				}
			} else if (direction == "-") {
				currentImage--;
				if (currentImage < 0) {
					currentImage = totalImages;
				}
			}
			for (var imageNumber = 0; imageNumber <= totalImages; imageNumber++) {
				document.getElementById(imageIds[imageNumber]).style.display = 'none';
			}
			document.getElementById(imageIds[currentImage]).style.display = 'block';
			ReplaceContent("ImageNumber",currentImage + 1);
		}

		function Initialize() {
			try {
				var all = document.all ? document.all : document.getElementsByTagName('div');
				for (var elementNumber = 0; elementNumber < all.length; elementNumber++) {
					if (all[elementNumber].className == "ImageDiv") {
						imageIds[totalImages] = all[elementNumber].id;
						totalImages++;
					}
				}
				totalImages--;
	
				var imageHeight = 0;
				for (var imageNumber = 0; imageNumber <= totalImages; imageNumber++) {
					if (document.getElementById(imageIds[imageNumber]).offsetHeight > imageHeight) {
						imageHeight = document.getElementById(imageIds[imageNumber]).offsetHeight;
					}
					document.getElementById(imageIds[imageNumber]).style.display = 'none';
				}
				if (imageIds[0]) {
					document.getElementById(imageIds[0]).style.display = 'block';
					document.getElementById("ImageBox").style.height = imageHeight + "px";
					if (totalImages >= 1) {
						document.getElementById("ImageControl").style.display = 'block';
						ReplaceContent("ImageNumber","1");
						ReplaceContent("TotalImages",totalImages + 1);
					}
					document.getElementById("ImageBox").style.visibility = 'visible';
				}
			} catch(error) {
				return false;
			}
		}

		Initialize();
	}

	this.Map = function(elementId,latitude,longitude,description,icon,mapCallback) {
		try {
			var element = document.getElementById(elementId);
		} catch(error) {
			return false;
		}

		if (! latitude) { return false; }
		if (! longitude) { return false; }

		this.AddMarker = function(latitude,longitude,description,icon,zIndex) {
			var point = new GLatLng(latitude,longitude);
			var marker = new Marker(point,description,icon,zIndex);
			map.addOverlay(marker);
		}

		function Icon(image) {
			var icon = new GIcon();
			icon.image = "/art/maps/icons/" + image; 
			icon.iconAnchor = new GPoint(16,16);
			icon.infoWindowAnchor = new GPoint(16,0);
			icon.iconSize = new GSize(22,32);
			return icon;
		}

		function Marker(point,description,image,zIndex) {
			var markerOptions = { zIndexProcess:GetZIndex };
			if (image) {
				var icon = new Icon(image);
				markerOptions = { icon:icon,zIndexProcess:GetZIndex };
			}

			var marker = new GMarker(point,markerOptions);
			marker.zIndex = zIndex;
			if (description) {
				var html = "<div>" + decodeURIComponent(description) + "</div>";
				GEvent.addListener(marker,"click",function() {
					marker.openInfoWindowHtml(decodeURIComponent(description));
				});
			}

			return marker;
		}

		function GetDistance(sourceLatitude,sourceLongitude,destinationLatitude,destinationLongitude) {
			var radiusEarth = 6371; // kilometers

			function DegreesToRadians(degrees) {
				return degrees * Math.PI / 180;
			}

			sourceLatitude = DegreesToRadians(sourceLatitude);
			sourceLongitude = DegreesToRadians(sourceLongitude);
			destinationLatitude = DegreesToRadians(destinationLatitude);
			destinationLongitude = DegreesToRadians(destinationLongitude);

			var distance = Math.acos(Math.sin(sourceLatitude) * Math.sin(destinationLatitude) + Math.cos(sourceLatitude) * Math.cos(destinationLatitude) * Math.cos((destinationLongitude - sourceLongitude))) * radiusEarth;
			return distance; // kilometers
		}

		function GetZoomForDistance(distance) {
			var distanceMaximum = 18000; // kilometers
			var zoomMinimum = 1;
			var zoomMaximum = 14;

			var zoom = zoomMaximum - ((zoomMaximum - zoomMinimum) * (distance / distanceMaximum));
			zoom = (zoom > 0 ? Math.floor(zoom) : Math.ceil (zoom));
			return zoom;
		}

		function GetZIndex(marker,unused) {
			return GOverlay.getZIndex(marker.getPoint().lat()) + marker.zIndex * 1000000;
		}

		ST_callback = function() {
			// delay map load for slow browsers
			setTimeout(function() {
				var homeLatitude = 47.620716; // degrees
				var homeLongitude = -122.347533; // degrees
				var zoom = GetZoomForDistance(GetDistance(homeLatitude,homeLongitude,latitude,longitude));

				this.map = new GMap2(element);

				var center = new GLatLng(latitude,longitude);
				map.addControl(new GSmallMapControl());
				map.setCenter(center,zoom);

				var marker = new Marker(center,description,icon,100);
				map.addOverlay(marker);

				if (mapCallback) {
					mapCallback();
				}
			},300);
		}

		var head = document.getElementsByTagName("head")[0];
		var script = document.createElement("script");
		script.src = "http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAiwQtnpn7b2hCLsfhsf9inxT4-dzEtyrooIDu8E6uHITdmt7QKxT95xaBl3RAWIx3hTPW_cYH2nmGlg&async=2&callback=ST_callback";
		script.type = "text/javascript";
		head.appendChild(script);
	}

	this.Tabs = function() {
		try {
			var tabs = new Array();
			var tabSetNumber = 0;
		
			var allElements = document.all ? document.all : document.getElementsByTagName('div');
			for (var elementNumber = 0; elementNumber < allElements.length; elementNumber++) {
				if (allElements[elementNumber].className == 'st_tabs') {
					var contentElements = new Array();
					var contentNumber = 0;
					var labelElements = new Array();
					var labelNumber = 0;
	
					var tabElements = allElements[elementNumber].getElementsByTagName("DIV");
					for (var tabKey in tabElements) {
						if ((tabElements[tabKey].className == 'st_tabs_label_on') || (tabElements[tabKey].className == 'st_tabs_label_off')) {
							tabElements[tabKey].st_tabSet = tabSetNumber;
							tabElements[tabKey].st_tab = labelNumber;
							tabElements[tabKey].onclick = function() { SelectTab(this.st_tabSet,this.st_tab); }
	
							labelElements.push(tabElements[tabKey]);
	
							labelNumber++;
						}
						if (tabElements[tabKey].className == 'st_tabs_content') {
							contentElements.push(tabElements[tabKey]);
	
							if (labelElements[contentNumber].className == 'st_tabs_label_on') {
								tabElements[tabKey].style.display = 'block';
							}
	
							contentNumber++;
						}
					}
	
					var tabSet = {"label_elements":labelElements,"content_elements":contentElements};
					tabs[tabSetNumber] = tabSet;
	
					tabSetNumber++;
				}
			}		
		} catch(error) {
			return false;
		}

		function SelectTab(tabSet,tab) {
			try {
				var tabSet = tabs[tabSet];
	
				for (var tabNumber in tabSet.label_elements) {
					tabSet.label_elements[tabNumber].className = 'st_tabs_label_off';
					tabSet.content_elements[tabNumber].style.display = 'none';
					if (tabNumber == tab) {
						tabSet.label_elements[tabNumber].className = 'st_tabs_label_on';
						tabSet.content_elements[tabNumber].style.display = 'block';
					}
				}
			} catch(error) {
				return false;
			}
		}
	}

	function ReplaceContent(elementId,content) {
		try {
			var element = document.getElementById(elementId);
		} catch(error) {
			return false;
		}

		if (document.all) {
			element.innerHTML = content;
		} else {
			while (element.hasChildNodes()) { element.removeChild(element.lastChild); }
			var range = document.createRange();
			range.setStartAfter(element);
			var fragment = range.createContextualFragment(content);
			element.appendChild(fragment);
		}
	}

/*
	this.AddLoadEvent = function(func){
		var oldOnLoad = window.onload;
		if (typeof window.onload != 'function'){
	    	window.onload = func;
		} else {
			window.onload = function(){
				oldOnLoad();
				func();
			}
		}
	}
	this.RPC = function(params){
		//since we are frequently crossing domains (blue vs grey), we cannot rely
		//on AJAX like functions.
		if( !params.URI ) return false;

		//RPC grabs an external js file (which is really a dynamic page) and loads it into the head
		var scriptObj = document.getElementById('rpc');
		if( scriptObj != null ){
			scriptObj.parentNode.removeChild(scriptObj);
			delete scriptObj;
		}

		var scriptObj = document.createElement('script');
		scriptObj.setAttribute('type', 'text/javascript');
		scriptObj.setAttribute('src', params.URI);
		scriptObj.id = 'rpc';
		document.getElementsByTagName('head')[0].appendChild(scriptObj);
		return;
	}
*/
}

