var mapMaker = {
	offsetX: -10, // tooltip X offset
	offsetY: 10,  // 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');
		// 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';
					//strip whitespace
					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 evt = this;
	    var id = this.accessKey;
	    var deals = mapMaker.getElementsByClassName("dd" + id);
	    mapMaker.element = deals;
        // map size
        var mapWidth  = evt.parentNode.parentNode.offsetWidth;
		var mapHeight = evt.parentNode.parentNode.offsetHeight;
        //get width and height of the DD
		var toopTipWidth;
		var toopTipHeight = 0;
	    var ii = 0;
        while (deals.length > ii){
             currentdd = deals[ii];
		    toopTipWidth = currentdd.offsetWidth;
		    toopTipHeight = currentdd.offsetHeight + 2;
		    ii++;
        }
        // location
	    var top = evt.offsetTop;
	    var left = evt.offsetLeft + 30;
	    var reverse = false;
	    if ((left + toopTipWidth) > mapWidth) {reverse = true;left = left - toopTipWidth - 50;}
	    if ((top + toopTipHeight) > mapHeight) {top = top - toopTipHeight - 10;}
	    
	   ii = 0;
	   while (deals.length > ii){
	        currentdd = deals[ii];
	        currentdd.style.top = top + "px";
	        currentdd.style.left = left + "px";
	        var x1 = evt.offsetLeft;
	        if (!reverse) {x1 = x1 + 10;}
	        var y1 = evt.offsetTop + 5;
	        var x2 = left;
	        if (reverse) {x2 = x2 + currentdd.offsetWidth};
	        
	        var y2 = top + (currentdd.offsetHeight / 2);
	        jg.drawLine(x1, y1, x2, y2);
            top = top + currentdd.offsetHeight + 2;
            ii++;
	   }
        jg.paint();
	},
	/* HIDE TOOLTIP */
    hideTooltip: function() {
        var ii = 0;
        while (mapMaker.element.length > ii){
            var currentdd = mapMaker.element[ii];
            currentdd.style.left = '-9999px';
            ii++;
        }
        if(jg) {jg.clear()};
        //mapMaker.element.style.left = '-9999px';
	},
	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;
	},
	getElementsByClassName: function(cl) {
        var retnode = [];
        var myclass = new RegExp('\\b'+cl+'\\b');
        var elem = document.getElementsByTagName('*');
        for (var i = 0; i < elem.length; i++) {
            var classes = elem[i].className;
            if (myclass.test(classes)) retnode.push(elem[i]);
        }
        return retnode;
    },
	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=include/ie_onload.js><"+"/script>");
		/*@end @*/
		
	/* for other browsers */
		mapMaker.addEvt( window, 'load', mapMaker.init);
