MediaWiki:ImageMapHighlighter.js

Revision as of 12:52, 23 June 2021 by Simon Stier (talk | contribs) (import from testwiki.kiprobatt.de)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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, which has a <div>-tag with the "imageMapHighlighter" class.
  //When the placement parameter (center, left or right) is set, the <div>-tag number changes, so it has to go deeper to get the image.
  var mhs = document.getElementsByClassName("imageMapHighlighter");
  
  if (document.getElementsByClassName('center').length > 0) {
  var img = mhs[0].children[0].children[0].children[0].children[1];
  var areas = mhs[0].children[0].children[0].children[0].children[0].children;}
  else if(document.getElementsByClassName('floatleft').length > 0 || document.getElementsByClassName('floatright').length > 0 ){
  var img = mhs[0].children[0].children[0].children[1];
  var areas = mhs[0].children[0].children[0].children[0].children;}
  else{
  var img = mhs[0].children[0].children[1];
  var areas = mhs[0].children[0].children[0].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;
  if (document.getElementsByClassName('center').length > 0) {
       mhs[0].children[0].children[0].children[0].insertBefore(img2, img);}
  else if(document.getElementsByClassName('floatleft').length > 0 || document.getElementsByClassName('floatright').length > 0 ){
  mhs[0].children[0].children[0].insertBefore(img2, img)}
  else{mhs[0].children[0].insertBefore(img2, img);}
  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.
  
  //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;
  if (document.getElementsByClassName('center').length > 0) {
       mhs[0].children[0].children[0].children[0].insertBefore(canv, img2);}
  else if(document.getElementsByClassName('floatleft').length > 0 || document.getElementsByClassName('floatright').length > 0 ){
  mhs[0].children[0].children[0].insertBefore(canv, img2);}
  else{mhs[0].children[0].insertBefore(canv, img2);}
  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 mhs2 = document.getElementsByClassName("imageMapHighlighter");

  if(mhs2.length > 0){
   start(); 
  }
  
});