var mapMaker = {
    offsetX : -16, // tooltip X offset
    offsetY : 16,  // tooltip Y offset
    element : false,
    element2: 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(id, mod) {
        var evt = this;
        var i = 0;

        if (typeof id == "string")
        {
            //Find DD to display
            if (typeof mod == "string")
            {
                var objid = document.getElementById("dd_" + mod + "_" + id);
            }
            else
            {
                var objid = document.getElementById("dd_" + id);
            }
        }
        else
        {
            //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;

        if (typeof id == "string")
        {
            if (typeof mod == "string")
            {
                var location = document.getElementById("location_" + mod + "_" + id);
            }
            else
            {
                var location = document.getElementById("location_" + id);
            }
            
            mapMaker.element2 = location;
            var newX = location.offsetLeft + mapMaker.offsetX;
            var newY = location.offsetTop + mapMaker.offsetY;
        }
        else
        {
            //Find DD to display - based on currently hovered anchor move to parent DT then next sibling DD
            //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';
        };
        objid.style.left = newX-toopTipWidth-24 + 'px';
        //check if tooltip fits map height
        if ((newY + toopTipHeight) > mapHeight) {
            objid.style.top = newY-toopTipHeight-14 + 'px';
        } else {
            objid.style.top = newY + 'px';
        };
objid.style.top = newY-toopTipHeight-14 + 'px';
        if (mapMaker.element2)
        {
            mapMaker.element2.style.background = "url(/templates/default/img/point-hover.png) no-repeat";
        }
    },
    /* HIDE TOOLTIP */
    hideTooltip: function() {
        mapMaker.element.style.left = '-9999px';

        if (mapMaker.element2)
        {
            mapMaker.element2.style.background = "url(/templates/default/img/point.png) no-repeat";
            mapMaker.element2 = false;
        }
    },
    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);
