MediaWiki:ImageMapHighlighter.js
Note: After saving, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Go to Menu → Settings (Opera → Preferences on a Mac) and then to Privacy & security → Clear browsing data → Cached images and files.
$(document).ready(function() {
function start() {
var areaOpacity = "0.1";
//In this part it receives the original Image and the given areas for the ImageMap.
var img = $("img[usemap^='#ImageMap_']")[0];
var areas = $("map[name^='ImageMap_']").children();
var canv = document.createElement('canvas'); //A canvas gets created, where it will draw the areas.
//The original Image gets set to very low opacity, so its still there and the user can click on the original created areas.
img.setAttribute("style", "opacity:0.01; -moz-opacity:0.5; filter:alpha(opacity=50)");
var img2 = new Image();
img2.style = img.style;
img2.width = img.width;
img2.height = img.height;
img2.src = img.src;
img2.style = "position: absolute; opacity: 1";
img2.style.zIndex = "-20"; //After a copy of the original Image is created, it gets set beneath the original image.
img.parentNode.insertBefore(img2, img);
//The canvas is given the width and height of the original image.
//It is then placed between the copy and the original image.
canv.id = 'mainCanvas';
canv.width = img.width;
canv.height = img.height;
canv.style.position = "absolute";
canv.style.opacity = areaOpacity;
$(canv).insertAfter("map[name^='ImageMap_']");
var ctx = canv.getContext("2d");
//The three draw functions can take the paramenters "coords" and "color".
//With these parameters they draw the areas on the canvas.
function drawSingleCircle(coords, color) {
var x1 = coords[0];
var y1 = coords[1];
var r = coords[2];
ctx.save();
ctx.beginPath();
ctx.arc(x1, y1, r, 0, Math.PI * 2);
ctx.fillStyle = color
ctx.closePath();
ctx.stroke();
ctx.fill();
ctx.restore();
};
function drawSingleRect(coords, color) {
var x1 = coords[0];
var y1 = coords[1];
var x2 = coords[2];
var y2 = coords[3];
var w = parseInt(x2) - parseInt(x1);
var h = parseInt(y2) - parseInt(y1);
ctx.save();
ctx.fillStyle = color
ctx.fillRect(x1, y1, w, h);
ctx.restore();
};
function drawSinglePolygon(coords, color) {
ctx.save();
ctx.beginPath();
ctx.moveTo(coords.shift(), coords.shift());
while (coords.length) {
ctx.lineTo(coords.shift(), coords.shift());
}
ctx.closePath();
ctx.stroke();
ctx.fillStyle = color;
ctx.fill();
ctx.closePath();
ctx.restore();
}
//The mouseover events can take the areas from the ImageMap.
//Whenever the cursor is over one of the given areas, it is drawn in red.
function rectMouseOverEvent(area) {
var coords = area.coords;
coords = coords.split(",");
drawSingleRect(coords, "red");
}
function circleMouseOverEvent(area) {
var coords = area.coords;
coords = coords.split(",");
drawSingleCircle(coords, "red");
}
function polyMouseOverEvent(area) {
var coords = area.coords;
coords = coords.split(",");
drawSinglePolygon(coords, "red");
}
//After the cursor has left the area, it will be drawn in blue again.
function mouseOutEvent(area) {
drawAll();
}
//At the start, the function drawArea gets called by function drawAll and it draws all given areas from the ImageMap in blue.
function drawArea(area) {
var coords = area.coords;
coords = coords.split(",");
if (area.shape == "rect") {
drawSingleRect(coords, "blue");
} else if (area.shape == "circle") {
drawSingleCircle(coords, "blue");
} else if (area.shape == "poly") {
drawSinglePolygon(coords, "blue");
}
}
//The function addEventsToAreas adds the mouseover and mouseout functions to the areas.
function addEventsToAreas() {
//var area = 0;
for (var i = 0; i < areas.length; i++) {
var area = areas[i];
area.addEventListener('mouseout', function() {
mouseOutEvent(this)
});
if (area.shape == "rect") {
area.addEventListener('mouseover', function() {
rectMouseOverEvent(this)
});
}
}
for (var i = 0; i < areas.length; i++) {
var area2 = areas[i];
if (area2.shape == "poly") {
area2.addEventListener('mouseover', function() {
polyMouseOverEvent(this);
});
}
}
for (var i = 0; i < areas.length; i++) {
var area3 = areas[i];
if (area3.shape == "circle") {
area3.addEventListener('mouseover', function() {
circleMouseOverEvent(this);
});
}
}
}
//The drawAll function runs through all given areas and draws them on the canvas.
function drawAll() {
ctx.clearRect(0, 0, canv.width, canv.height);
for (var i = 0; i < areas.length; i++) {
var area = areas[i];
drawArea(area);
}
}
function init() {
drawAll();
addEventsToAreas();
}
mw.loader.using(['mediawiki.util']).done(init);
};
var mhs = document.getElementsByClassName("imageMapHighlighter");
if (mhs.length > 0) {
start();
}
});