var MAX_OPACITY=0.9;
var ANIMATION_INTERVAL=20;
var OPACITY_INCREMENT=0.1;

// Note that Firefox (2.0.0.11) does not terminate this script properly once the page is no longer displayed, resulting in
// repeated javascript errors.  Not sure how to work around this so just ignore the problem until the bugs are hopefully fixed!


var hoverImages;
var hoverWindows;

registerInitFunction(function() {
	hoverImages=getElementsByClassName("HoverImage");
	hoverWindows=getElementsByClassName("HoverWindow")
	initHoverWindows();
	initMapRollovers();
});

function showHovers() {
	var element=this;
	if (element==null || element.id==null || element.id=="") return;
	showHoversById(element.id);
}

function showHoversById(id) {
	showHoverImage(id);
	showHoverWindow(id);
}

function showHoverImage(id) {
	if (id) showElement(document.getElementById("HoverImage_"+id));
}

function showHoverWindow(id) {
	if (id) fadeInElement(document.getElementById("HoverWindow_"+id));
}

function showElement(element) {
	if (element) element.style.display="block";
}

function hideElement(element) {
	if (element) element.style.display="none";
}

function hideHovers() {
	hideElements(hoverImages);
	fadeOutElements(hoverWindows);
}

function hideElements(elements) {
	if (elements==null) return;
	for (var i=0; i<elements.length; i++) {
		var element=elements[i];
		hideElement(element);
	}
}

function initHoverWindows() {
	var elements=hoverWindows;
	for (var i=0; i<elements.length; i++) {
		var element=elements[i];
		setOpacity(element,0);
		hideElement(element);
		if (!element.id) continue;
		var id=element.id.substring("HoverWindow_".length);
		var triggerElement=document.getElementById(id);
		if (!triggerElement) continue;
		triggerElement.onmouseover=showHovers;
		triggerElement.onmouseout=hideHovers;
	}
}

function initMapRollovers() {
	var mapElements=getElementsByClassName("HoverMap","map");
	for (var i=0; i<mapElements.length; i++) {
		var mapElement=mapElements[i];
		var elements=mapElement.getElementsByTagName("area");
		for (var x=0; x<elements.length; x++) {
			var element=elements[x];
			element.onmouseover=showHovers;
			element.onmouseout=hideHovers;
		}
	}
}

function fadeInElement(element) {
	if (!element) return;
	fadeOpacity(element,MAX_OPACITY);
}

function fadeOutElements(elements) {
	for (var i=0; i<elements.length; i++) {
		var element=elements[i];
		fadeOpacity(element,0);
	}
}

function fadeOpacity(element,opacity) {
	element.targetOpacity=opacity;
	if (opacity>0) showElement(element);
	if (element.opacity==opacity) return;
	if (!element.intervalID) element.intervalID=setInterval("animateOpacity('"+element.id+"')",ANIMATION_INTERVAL);
}

function setOpacity(element,opacity) {
	element.style.opacity=opacity;
	element.style.filter="alpha(opacity="+(opacity*100)+")";
	element.opacity=opacity;
}

function animateOpacity(elementID) {
	var element=document.getElementById(elementID);
	var opacity=element.opacity;
	if (opacity<element.targetOpacity) {
		opacity+=OPACITY_INCREMENT;
		if (opacity>element.targetOpacity) opacity=element.targetOpacity;
	} else {
		opacity-=OPACITY_INCREMENT;
		if (opacity<element.targetOpacity) opacity=element.targetOpacity;
	}
	opacity=Math.round(opacity*1000)/1000;
	setOpacity(element,opacity);
	if (opacity==element.targetOpacity) {
		clearInterval(element.intervalID);
		element.intervalID=null;
		if (opacity==0) hideElement(element);
	}
}