Spaces:
Running
on
Zero
Running
on
Zero
/*! Image Map Resizer | |
* Desc: Resize HTML imageMap to scaled image. | |
* Copyright: (c) 2014-15 David J. Bradshaw - [email protected] | |
* License: MIT | |
*/ | |
;(function() { | |
'use strict' | |
function scaleImageMap() { | |
function resizeMap() { | |
function resizeAreaTag(cachedAreaCoords, idx) { | |
function scale(coord) { | |
var dimension = 1 === (isWidth = 1 - isWidth) ? 'width' : 'height' | |
return ( | |
padding[dimension] + | |
Math.floor(Number(coord) * scalingFactor[dimension]) | |
) | |
} | |
var isWidth = 0 | |
areas[idx].coords = cachedAreaCoords | |
.split(',') | |
.map(scale) | |
.join(',') | |
} | |
var scalingFactor = { | |
width: image.width / image.naturalWidth, | |
height: image.height / image.naturalHeight, | |
} | |
var padding = { | |
width: parseInt( | |
window.getComputedStyle(image, null).getPropertyValue('padding-left'), | |
10 | |
), | |
height: parseInt( | |
window.getComputedStyle(image, null).getPropertyValue('padding-top'), | |
10 | |
), | |
} | |
cachedAreaCoordsArray.forEach(resizeAreaTag) | |
} | |
function getCoords(e) { | |
//Normalize coord-string to csv format without any space chars | |
return e.coords.replace(/ *, */g, ',').replace(/ +/g, ',') | |
} | |
function debounce() { | |
clearTimeout(timer) | |
timer = setTimeout(resizeMap, 250) | |
} | |
function start() { | |
if ( | |
image.width !== image.naturalWidth || | |
image.height !== image.naturalHeight | |
) { | |
resizeMap() | |
} | |
} | |
function addEventListeners() { | |
image.addEventListener('load', resizeMap, false) //Detect late image loads in IE11 | |
window.addEventListener('focus', resizeMap, false) //Cope with window being resized whilst on another tab | |
window.addEventListener('resize', debounce, false) | |
window.addEventListener('readystatechange', resizeMap, false) | |
document.addEventListener('fullscreenchange', resizeMap, false) | |
} | |
function beenHere() { | |
return 'function' === typeof map._resize | |
} | |
function getImg(name) { | |
return document.querySelector('img[usemap="' + name + '"]') | |
} | |
function setup() { | |
areas = map.getElementsByTagName('area') | |
cachedAreaCoordsArray = Array.prototype.map.call(areas, getCoords) | |
image = getImg('#' + map.name) || getImg(map.name) | |
map._resize = resizeMap //Bind resize method to HTML map element | |
} | |
var /*jshint validthis:true */ | |
map = this, | |
areas = null, | |
cachedAreaCoordsArray = null, | |
image = null, | |
timer = null | |
if (!beenHere()) { | |
setup() | |
addEventListeners() | |
start() | |
} else { | |
map._resize() //Already setup, so just resize map | |
} | |
} | |
function factory() { | |
function chkMap(element) { | |
if (!element.tagName) { | |
throw new TypeError('Object is not a valid DOM element') | |
} else if ('MAP' !== element.tagName.toUpperCase()) { | |
throw new TypeError( | |
'Expected <MAP> tag, found <' + element.tagName + '>.' | |
) | |
} | |
} | |
function init(element) { | |
if (element) { | |
chkMap(element) | |
scaleImageMap.call(element) | |
maps.push(element) | |
} | |
} | |
var maps | |
return function imageMapResizeF(target) { | |
maps = [] // Only return maps from this call | |
switch (typeof target) { | |
case 'undefined': | |
case 'string': | |
Array.prototype.forEach.call( | |
document.querySelectorAll(target || 'map'), | |
init | |
) | |
break | |
case 'object': | |
init(target) | |
break | |
default: | |
throw new TypeError('Unexpected data type (' + typeof target + ').') | |
} | |
return maps | |
} | |
} | |
if (typeof define === 'function' && define.amd) { | |
define([], factory) | |
} else if (typeof module === 'object' && typeof module.exports === 'object') { | |
module.exports = factory() //Node for browserfy | |
} else { | |
window.imageMapResize = factory() | |
} | |
if ('jQuery' in window) { | |
window.jQuery.fn.imageMapResize = function $imageMapResizeF() { | |
return this.filter('map') | |
.each(scaleImageMap) | |
.end() | |
} | |
} | |
})() | |