/* A More Accessible Map */

function Detect() {
	
	agent 	= navigator.userAgent.toLowerCase();
						
	// detect OS
	this.isMac		= (agent.indexOf('mac') != -1);
	this.isWin		= (agent.indexOf('win') != -1);
	this.isWin2k	= (this.isWin && (agent.indexOf('nt 5') != -1));
	this.isWinSP2	= (this.isWin && (agent.indexOf('xp') != -1 || agent.indexOf('sv1') != -1));
	this.isOther	= (agent.indexOf('unix') != -1 || agent.indexOf('sunos') != -1 || agent.indexOf('bsd') != -1 || agent.indexOf('x11') != -1 || agent.indexOf('linux') != -1);
	
	// detect browser
	this.isSafari	= (agent.indexOf('safari') != -1);
	this.isSafari2 = (this.isSafari && (parseFloat(agent.substring(agent.indexOf("applewebkit/")+"applewebkit/".length,agent.length).substring(0,agent.substring(agent.indexOf("applewebkit/")+"applewebkit/".length,agent.length).indexOf(' '))) >=  300));
	this.isOpera	= (agent.indexOf('opera') != -1);
	this.isNN		= (agent.indexOf('netscape') != -1);
	this.isFF3		= (agent.indexOf('firefox/3') != -1);
	this.isIE		= (agent.indexOf('msie') != -1);
	this.isIE6		= (agent.indexOf('msie 6.') != -1);
	this.isIE5		= (agent.indexOf('msie 5.') != -1);
}

var browser = new Detect();
	
var mapMaker = {
	offsetX: -16, // tooltip X offset
	offsetY: 16,  // tooltip Y offset
	element: false,
	DLs:     false,
	DTs:     false,
	on:      false,
	/* constructor - sets events */
	init: function(){
		var i=0;
		var ii=0;
		var currentLocation = 0;
		mapMaker.DLs = document.getElementsByTagName('dl');
		mapMaker.DTs = document.getElementsByTagName('dt');
		mapMaker.canClose = true;
		
		if(document.getElementById('dublin-pop')){
			mapMaker.addEvt(document.getElementById('dublin-pop'),'mouseover',mapMaker.stopClose);
			mapMaker.addEvt(document.getElementById('dublin-pop'),'mouseout',mapMaker.allowClose);
		}
		
		//  wicklow update
		if(document.getElementById('wicklow-pop')){
			mapMaker.addEvt(document.getElementById('wicklow-pop'),'mouseover',mapMaker.stopClose);
			mapMaker.addEvt(document.getElementById('wicklow-pop'),'mouseout',mapMaker.allowClose);
		}
		
		if(document.getElementById('waterford-pop')){
			mapMaker.addEvt(document.getElementById('waterford-pop'),'mouseover',mapMaker.stopClose);
			mapMaker.addEvt(document.getElementById('waterford-pop'),'mouseout',mapMaker.allowClose);
		}
		
		
		
		
		
		
		
		// only loop thru items once
		if( mapMaker.on == false ){
			//loop through each DL on page
			while (mapMaker.DLs.length > i) {
				//only affect DLs with a class of 'map'
				if (mapMaker.DLs[i].className == 'map'){
					//change map DL class, this way map is text only without javascript enabled
					mapMaker.DLs[i].className = 'map on';
					//remove any white space
					mapMaker.stripWhitespace(mapMaker.DLs[i]);
					mapMaker.stripWhitespace(mapMaker.DTs[i]);
					// loop thru all DT elements
					while (mapMaker.DTs.length > ii){
						//current Location
						currentLocation = mapMaker.DTs[ii].firstChild;
						// add events to links
						mapMaker.addEvt(currentLocation,'mouseover',mapMaker.showTooltip);//displays tooltip on mouse over
						mapMaker.addEvt(currentLocation,'mouseout',mapMaker.hideTooltip);//hide tooltip on mouse out
						mapMaker.addEvt(currentLocation,'focus',mapMaker.showTooltip);//display tooltip on focus, for added keyboard accessibility
						mapMaker.addEvt(currentLocation,'blur',mapMaker.hideTooltip);//hide tooltip on focus, for added keyboard accessibility
						ii++;
					};
					ii=0;
				};
				i++;
			};
			mapMaker.on = true;
		};
	},
	/* SHOW TOOLTIP */
	showTooltip: function() {
		var evt = this;
		var i = 0;
		//Find DD to display - based on currently hovered anchor move to parent DT then next sibling DD
		var objid = evt.parentNode.nextSibling;
		mapMaker.element = objid;//set for the hideTooltip
		//get width and height of background map
		var mapWidth  = objid.parentNode.offsetWidth;
		var mapHeight = objid.parentNode.offsetHeight;
		//get width and height of the DD
		var toopTipWidth = objid.offsetWidth;
		var toopTipHeight = objid.offsetHeight;
		//figure out where tooltip should be places based on point location
		var newX, newY;
		if(this.className == "locationdub"){
			
			newX = evt.offsetLeft + mapMaker.offsetX;
			newY = evt.offsetTop + mapMaker.offsetY;
			if(document.getElementById('dublin-pop')){
				document.getElementById('dublin-pop').style.visibility = 'visible';
				document.getElementById('dublin-pop').style.left = -25 + newX + 'px';
				document.getElementById('dublin-pop').style.top = newY -40 + 'px';	
				if(browser){
					if(browser.isIE5 || browser.isIE6){
						if(IEPNGFix){
							clearTimeout(IEPNGFix.update.timer);
							IEPNGFix.update.timer = setTimeout(IEPNGFix.update, 100);
						}
					}
				}
			}
			
		} 
		
		//wicklow update
		else if(this.className == "locationwicklow"){
			// alert("wicklow")

			newX = evt.offsetLeft + mapMaker.offsetX;
			newY = evt.offsetTop + mapMaker.offsetY;
			if(document.getElementById('wicklow-pop')){
				document.getElementById('wicklow-pop').style.visibility = 'visible';
				document.getElementById('wicklow-pop').style.left = -25 + newX + 'px';
				document.getElementById('wicklow-pop').style.top = newY -40 + 'px';	
				if(browser){
					if(browser.isIE5 || browser.isIE6){
						if(IEPNGFix){
							clearTimeout(IEPNGFix.update.timer);
							IEPNGFix.update.timer = setTimeout(IEPNGFix.update, 100);
						}
					}
				}
			}
			
		}
		
		//waterford update
		else if(this.className == "locationwaterford"){
			// alert("wicklow")

			newX = evt.offsetLeft + mapMaker.offsetX;
			newY = evt.offsetTop + mapMaker.offsetY;
			if(document.getElementById('waterford-pop')){
				document.getElementById('waterford-pop').style.visibility = 'visible';
				document.getElementById('waterford-pop').style.left = -25 + newX + 'px';
				document.getElementById('waterford-pop').style.top = newY -40 + 'px';	
				if(browser){
					if(browser.isIE5 || browser.isIE6){
						if(IEPNGFix){
							clearTimeout(IEPNGFix.update.timer);
							IEPNGFix.update.timer = setTimeout(IEPNGFix.update, 100);
						}
					}
				}
			}
			
		}
		
		
		else {
			newX = evt.offsetLeft + mapMaker.offsetX - 80;
			newY = evt.offsetTop + mapMaker.offsetY - 80;
			//check if tooltip fits map width 
			objid.style.left = newX + 'px';
			objid.style.top = newY + 'px';
		}
	},
	
	stopClose: function(){
		mapMaker.canClose = false;
	},
	
	allowClose: function(){
		mapMaker.canClose = true;
	},
	
	checkDub: function(){
		if(mapMaker.canClose)
		{
			if(mapMaker.element.style){ mapMaker.element.style.left = '-9999px'; }
			if(document.getElementById('dublin-pop') || document.getElementById('wicklow-pop') || document.getElementById('waterford-pop'))
			{
			   document.getElementById('dublin-pop').style.visibility = 'hidden';
			}
			if(document.getElementById('wicklow-pop'))
			{
			   document.getElementById('wicklow-pop').style.visibility = 'hidden';

			}
			if(document.getElementById('waterford-pop'))
			{
			   document.getElementById('waterford-pop').style.visibility = 'hidden';

			}
			
		}
		else 
		{
			timer = setTimeout("mapMaker.checkDub()",1000);
		}
	},
	
	
	
	checkWick: function(){
		if(mapMaker.canClose){
			if(mapMaker.element.style){ mapMaker.element.style.left = '-9999px'; }
			if(document.getElementById('wicklow-pop')){
			   document.getElementById('wicklow-pop').style.visibility = 'hidden';
			}
			
		} else {
			timer = setTimeout("mapMaker.checkWick()",1000);
		}
	},
	
  checkWaterford: function(){
		if(mapMaker.canClose){
			if(mapMaker.element.style){ mapMaker.element.style.left = '-9999px'; }
			if(document.getElementById('waterford-pop')){
			   document.getElementById('waterford-pop').style.visibility = 'hidden';
			}
			
		} else {
			timer = setTimeout("mapMaker.checkWaterford()",1000);
		}
	},
	
	
	
	
	
	
	
	
	/* HIDE TOOLTIP */
	hideTooltip: function() {
		//mapMaker.canClose = true;
		if(mapMaker.element.nodeName){
			if(mapMaker.element.nodeName.toLowerCase() == 'dd')
			{
				if(mapMaker.element.style){ mapMaker.element.style.left = '-9999px'; }
					if(document.getElementById('dublin-pop')){
					   document.getElementById('dublin-pop').style.visibility = 'hidden';
					}
				
				
			} else {
				timer = setTimeout("mapMaker.checkDub()",1000);
			}
		} else {
		}				
	},
	addEvt: function(element, type, handler) {
		// assign each event handler a unique ID
		if (!handler.$$guid) handler.$$guid = mapMaker.addEvt.guid++;
		// create a hash table of event types for the element
		if (!element.events) element.events = {};
		// create a hash table of event handlers for each element/event pair
		var handlers = element.events[type];
		if (!handlers) {
			handlers = element.events[type] = {};
			// store the existing event handler (if there is one)
			if (element["on" + type]) {
				handlers[0] = element["on" + type];
			};
		};
		// store the event handler in the hash table
		handlers[handler.$$guid] = handler;
		// assign a global event handler to do all the work
		element["on" + type] = mapMaker.handleEvent;
	},
	handleEvent: function(event) {
		var returnValue = true;
		// grab the event object (IE uses a global event object)
		event = event || mapMaker.fixEvent(window.event);
		// get a reference to the hash table of event handlers
		var handlers = this.events[event.type];
		// execute each event handler
		for (var i in handlers) {
			this.$$handleEvent = handlers[i];
			if (this.$$handleEvent(event) === false) {
				returnValue = false;
			};
		};
		return returnValue;
	},
	fixEvent: function(event) {
		// add W3C standard event methods
		event.preventDefault = mapMaker.fixEvent.preventDefault;
		event.stopPropagation = mapMaker.fixEvent.stopPropagation;
		return event;
	},
	stripWhitespace: function( el ){
		for(var i = 0; i < el.childNodes.length; i++){
			var node = el.childNodes[i];
			if( node.nodeType == 3 && !/\S/.test(node.nodeValue)) {
				node.parentNode.removeChild(node);
			};
		};
	}
};
mapMaker.fixEvent.preventDefault = function() {this.returnValue = false;};
mapMaker.fixEvent.stopPropagation = function() {this.cancelBubble = true;};
mapMaker.addEvt.guid = 1;


/* LOAD SCRIPT */
	/* for Mozilla */
		if (document.addEventListener) {
			document.addEventListener("DOMContentLoaded", mapMaker.init, null);
		};
		
	/* for Internet Explorer */
		/*@cc_on @*/
		/*@if (@_win32)
			document.write("<script defer src=../../js/ie_onload.js><"+"/script>");
		/*@end @*/
		
	/* for other browsers */
		mapMaker.addEvt( window, 'load', mapMaker.init);



