//sticky tooltip exaple 

var mapMaker = {
    offsetX: -16, // tooltip X offset
    offsetY: 16,  // tooltip Y offset
    element: null,
    DLs:     false,
    DTs:     false,
    DDs:     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.DDs = document.getElementsByTagName('dd');
        // 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]);
                    mapMaker.stripWhitespace(mapMaker.DDs[i]);
                    // loop thru all DT elements
                    while (mapMaker.DTs.length > ii){
                        // set the link for the current DT
                        currentLocation = mapMaker.DTs[ii].firstChild;
                        // add events to links
                        mapMaker.addEvt(currentLocation,'mouseover',mapMaker.showTooltip);//displays tooltip on mouse over
                        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;
                    //loop through DT elements and assign event to close link
                    while (mapMaker.DDs.length > ii){
                        currentLocation = mapMaker.DDs[ii].firstChild;
                        mapMaker.addEvt(currentLocation,'click',mapMaker.hideTooltip);//hide tooltip on click of close button
                        ii++;
                    };
                    ii=0;
                };
                i++;
            };
            mapMaker.on = true;
        };
    },
    /* SHOW TOOLTIP */
    showTooltip: function() {
                     var evt = this;
                     var i = 0;
                     mapMaker.hideTooltip();
                     //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 = evt.offsetLeft + mapMaker.offsetX;
                     var newY = evt.offsetTop + mapMaker.offsetY;
                     //check if tooltip fits map width 
                     if ((newX + toopTipWidth) > mapWidth) {
                         objid.style.left = newX-toopTipWidth-24 + 'px';
                     } else {
                         objid.style.left = newX + 'px';
                     };
                     //check if tooltip fits map height 
                     if ((newY + toopTipHeight) > mapHeight) {
                         objid.style.top = newY-toopTipHeight-14 + 'px';
                     } else {
                         objid.style.top = newY + 'px';
                     };
                 },
    /* HIDE TOOLTIP */
    hideTooltip: function() {
                     if (mapMaker.element != null) {
                         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;
            },
    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=ie_onload.js><"+"/script>");
/*@end @*/

/* for other browsers */
mapMaker.addEvt( window, 'load', mapMaker.init);

