// 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() {
			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';
			}
		}
		
		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);
	}

	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);
		}
	}
}