Function.prototype.bind = function(obj) {
    var method = this;
    return function() {
        return method.apply(obj, arguments);
    };
};

var mapOver = function() {
	this.start();
}

    // STATIC
    
    mapOver.getMapName = function(oImage) {
        var sImageMap = $(oImage).attr('usemap');
        return sImageMap.substr(0, 1) == '#'
                ? sImageMap.substr(1)
                : sImageMap;
    }
    
    mapOver.getMap = function(oImage) {
        return $('map[name="' + mapOver.getMapName(oImage) + '"]');
    }
    
    mapOver.getOverId = function(oImage) {
        return mapOver.getMapName(oImage) + '_overs';
    }

    mapOver.show = function() {
        var sOverId = mapOver.getOverId($(this));
        $('#' + sOverId).show("fast");
    }
    
    mapOver.hide = function() {
        var sOverId = mapOver.getOverId($(this));
        
        // have to use timeout to ensure rolling over blocks won't kill the hover blocks
        mapOver.noHide();
        mapOver.iHide = setTimeout(function() {
            $('#' + sOverId).hide("normal");
        }, 500);
    }
    
    mapOver.noHide = function() {
        clearTimeout(mapOver.iHide);
    }
    
    mapOver.hotLinks = function() {
        $('a[href$=' + $(this).attr('href') + ']').addClass('hot');      
    }
    
    mapOver.coldLinks = function() {
        $('a[href$=' + $(this).attr('href') + ']').removeClass('hot');        
    }
	
	// PUBLIC

	mapOver.prototype.start = function() {
		$('img[usemap]').each(this.parseMap.bind(this));
	}
	
	mapOver.prototype.parseMap = function(index, oImage) {
	    var sImageMap = mapOver.getMapName(oImage);
	    var sOverId   = mapOver.getOverId(oImage);
	    var oMap      = mapOver.getMap(oImage);
	    var bSetHover = false;
        
        oMap.after('<div id="' + sOverId + '"></div>');
	    
	    $('map[name="' + sImageMap + '"]>area').each(function(i, oArea) {
	        if ($(oArea).attr('shape').toLowerCase() == 'rect') {
	        	var aCoordinates    = $(oArea).attr('coords').split(',');
	        	
	        	if (aCoordinates.length == 4) {
	        		bSetHover   = true;
	            	var iLeft   = parseInt(aCoordinates[0]);
	                var iTop    = parseInt(aCoordinates[1]);
	                var iRight  = parseInt(aCoordinates[2]);
	                var iBottom = parseInt(aCoordinates[3]);
	                var iWidth  = iRight  - iLeft;
	                var iHeight = iBottom - iTop;
	                var oOffset = $(oImage).offset();
	        	
	        		var sId   = sImageMap + '_area_' + i;
	        		var sLink = '<a href="' + $(oArea).attr('href') + '" class="mapHover" title="' + $(oArea).attr('title') + '" id="' + sId + '"> </a>';
	        		
	        		$('#' + sOverId).append(sLink);
	        		$('#' + sId).css({
	        			                 width:   iWidth,
	        			                 height:  iHeight,
	        			                 left:    oOffset.left + iLeft,
	        			                 top:     oOffset.top  + iTop
	        		                  });
	        		                  
                    $('#' + sId).mouseover(mapOver.noHide);
                    $('#' + sId).hover(mapOver.hotLinks, mapOver.coldLinks);
	        	}
	        }
	    }.bind(this));
	
	    if (bSetHover) {
	        //$(oImage).hover(mapOver.show, mapOver.hide);
	    }
	}