|
|
Zeile 1: |
Zeile 1: |
− | /*
| |
− | modified by [[user:קיפודנחש]]
| |
− |
| |
− | original script by Peter Schlömer, can be found on
| |
− | https://tools.wmflabs.org/imagemapedit/ime.js,
| |
− | and contains the following copyright notice:
| |
− | =========== original license ================
| |
− | Copyright (c) 2007-2013 Peter Schlömer
| |
| | | |
− | Released under the following licenses (to make reuse in other Wikis
| |
− | easier):
| |
− |
| |
− | GNU General Public License (GPL), version 2
| |
− | GNU Free Documentatin Licence (GFDL), version 1.2 or later
| |
− | Creative Commons Attribution ShareAlike (CC-by-sa), version 2 or later
| |
− | =============================================
| |
− | */
| |
− |
| |
− | if (mw.config.get('wgNamespaceNumber') == 6 && mw.config.get('wgAction') == 'view')
| |
− | $(function() {
| |
− | // avoid multiple activation, e.g. when [[m:Special:MyPage/global.js]] activates the script
| |
− | // and it's also activated on the wiki
| |
− |
| |
− | if (window.mw_ime_running) return;
| |
− | window.mw_ime_running = true;
| |
− |
| |
− | var ime_translations = { error_imagenotfound: 'ImageMapEdit: Could not find image in page structure.' };
| |
− | var ime_areas = Array();
| |
− | var ime_currentlyEditing = -1;
| |
− | var ime_width;
| |
− | var ime_height;
| |
− | var ime_scale;
| |
− | var img;
| |
− | var $img;
| |
− | var context;
| |
− | var jcanvas;
| |
− | var imageProperties;
| |
− | var currentClicks = {};
| |
− | var ime_templateHtml;
| |
− | var listenToMouse = false;
| |
− | var selectArea;
| |
− |
| |
− | if (document.getElementById('file')) {
| |
− | ime_init1();
| |
− | }
| |
− |
| |
− | function ime_htmlNewDiv(id) {
| |
− | var div = document.createElement('div');
| |
− | if (id) div.id = id;
| |
− | return div;
| |
− | }
| |
− |
| |
− | /*
| |
− | Initialization, part 1: Tries to find image and uses a XMLHttpRequest
| |
− | to download information about the image. When this is done (it's an
| |
− | asynchronous request) show a link to load the rest of ImageMapEdit
| |
− | using ime_init2().
| |
− | */
| |
− | function ime_init1() {
| |
− | var divFile = document.getElementById('file');
| |
− | if (!divFile) {
| |
− | ime_error(ime_translations['error_imagenotfound'] + ' (ime_init1,divFile=null)');
| |
− | return;
| |
− | }
| |
− |
| |
− | var a = ime_findATag(divFile);
| |
− | if (!a) {
| |
− | ime_error(ime_translations['error_imagenotfound'] + ' (ime_init1,a=null)');
| |
− | return;
| |
− | }
| |
− |
| |
− | var img = a.firstChild;
| |
− | if (!img) {
| |
− | ime_error(ime_translations['error_imagenotfound'] + ' (ime_init1,img=null)');
| |
− | return;
| |
− | }
| |
− |
| |
− | var url = mw.config.get('wgScriptPath') + '/api.php?format=json&action=query&prop=imageinfo&iiprop=size&titles=' + mw.config.get('wgPageName');
| |
− |
| |
− | $.get(url, function(data) {
| |
− |
| |
− | if( typeof data.query.pages != "undefined" ) {
| |
− | imageProperties = data.query.pages[Object.keys(data.query.pages)[0]];
| |
− | var imageInfo = imageProperties.imageinfo;
| |
− | if (imageInfo) {
| |
− | ime_width = imageInfo[0].width;
| |
− | ime_height = imageInfo[0].height;
| |
− | ime_scale = img.width/ime_width;
| |
− |
| |
− | // Show 'show ImageMapEdit' button now
| |
− | $('<a>', { id: 'imeLink'})
| |
− | .css({ display: 'block' })
| |
− | .text('ImageMapEdit >')
| |
− | .click( function(e) {
| |
− | e.preventDefault();
| |
− | ime_init2();
| |
− | })
| |
− | .appendTo('#file');
| |
− | }
| |
− | }
| |
− | });
| |
− | }
| |
− |
| |
− | /*
| |
− | Initialization, part 2: Triggered by an external link. Does some moving
| |
− | around of the image in the logical structure of the page, then hides the
| |
− | link and finally puts the HTML code in place.
| |
− | */
| |
− |
| |
− | function ime_init2() {
| |
− |
| |
− | // Remove UI that might interfere with this code
| |
− | ime_removeOtherUIElements();
| |
− |
| |
− | var divFile = document.getElementById('file');
| |
− | var tempNode = divFile.firstChild;
| |
− | var a = ime_findATag(tempNode);
| |
− | var divImeContainer = ime_htmlNewDiv('imeContainer');
| |
− | img = a.firstChild,
| |
− | $img = $(img);
| |
− |
| |
− | divImeContainer.style.position = 'relative';
| |
− |
| |
− | // Move image from within link to outside
| |
− | a.removeChild(img);
| |
− | divFile.insertBefore(divImeContainer,tempNode);
| |
− | divFile.removeChild(tempNode);
| |
− | divFile.style.direction = 'ltr';
| |
− | img.id = 'imeImg';
| |
− | img.style.border = 'none';
| |
− | img.oncontextmenu = function(e){e.preventDefault();e.stopPropagation();};
| |
− |
| |
− | // Internet Explorer needs this differently
| |
− | if (typeof(navigator.userAgent) != 'undefined' && navigator.userAgent.match('/MSIE/')) {
| |
− | divImeContainer.style.overflow = 'none';
| |
− | }
| |
− | else {
| |
− | divImeContainer.style.overflow = 'auto';
| |
− | }
| |
− |
| |
− | divImeContainer.appendChild(img);
| |
− |
| |
− | jcanvas = $('<canvas>')
| |
− | .css( {
| |
− | position: 'absolute',
| |
− | width: $img.width() + 'px',
| |
− | height: $img.height() + 'px',
| |
− | border: 0,
| |
− | top:0,
| |
− | left:0
| |
− | })
| |
− | .attr({width: $img.width(), height: $img.height()})
| |
− | .appendTo(divImeContainer)
| |
− | context = jcanvas[0].getContext("2d");
| |
− | $.extend(context, {
| |
− | fillStyle: 'rgba(255,255,0,0.4)',
| |
− | strokeStyle: 'red',
| |
− | lineJoin: 'round',
| |
− | lineWidth: 1.5/ime_scale}
| |
− | );
| |
− | context.scale(ime_scale, ime_scale);
| |
− | jcanvas.mousedown(onmousedown);
| |
− | jcanvas.click(function(e){e.preventDefault();e.stopPropagation();})
| |
− | jcanvas[0].oncontextmenu = img.oncontextmenu = function(e){e.preventDefault();e.stopPropagation();};
| |
− |
| |
− | var divIme = ime_htmlNewDiv('ime');
| |
− | divFile.appendChild(divIme);
| |
− |
| |
− | // Hide the link now
| |
− | document.getElementById('imeLink').style.display = 'none';
| |
− |
| |
− | // Disable image context menu so right click can be used for events
| |
− | img.oncontextmenu = ime_eventDummy;
| |
− |
| |
− | $(divIme).html(ime_templateHtml);
| |
− |
| |
− | attachTemplate();
| |
− |
| |
− | // Translate texts
| |
− | ime_translate();
| |
− | }
| |
− |
| |
− | function ime_translate() {
| |
− | var allt = [ime_translations, window.ime_translations];
| |
− | while (allt.length) {
| |
− | var trans = allt.shift();
| |
− | if (trans)
| |
− | for (var key in trans)
| |
− | $('.ime_t_' + key).text(trans[key]);
| |
− | }
| |
− | }
| |
− |
| |
− | /*
| |
− | Finds all elements in the current document with the specified class.
| |
− | */
| |
− | function ime_getElementsByClassName(className) {
| |
− | // Hopefully the browser supports this natively
| |
− | if (document.getElementsByClassName) {
| |
− | return document.getElementsByClassName(className);
| |
− | }
| |
− |
| |
− | // Otherwise use the function defined by MediaWiki
| |
− | return getElementsByClassName(document,'*',className)
| |
− | }
| |
− |
| |
− | /*
| |
− | Display an error message, either by putting it on the page or - if the
| |
− | place to put it does not exist - by showing an alert box.
| |
− | */
| |
− | function ime_error(message) {
| |
− | var jqFile = $('#file');
| |
− | var jqIme = $('#ime');
| |
− |
| |
− | if (jqFile.length !== 0) {
| |
− | var jqImeError = $('<p>')
| |
− | .css({
| |
− | 'color' : 'darkred',
| |
− | 'background' : 'white',
| |
− | 'border' : '1px solid darkred',
| |
− | 'padding' : '1ex'
| |
− | })
| |
− | .text(message)
| |
− |
| |
− | if (jqIme !== 0) {
| |
− | jqIme.before(jqImeError);
| |
− | } else {
| |
− | jqImeError.appendTo(jqFile);
| |
− | }
| |
− | }
| |
− | else {
| |
− | window.alert(message);
| |
− | }
| |
− | }
| |
− |
| |
− | /*
| |
− | Dummy function to intercept events
| |
− | */
| |
− | function ime_eventDummy(e) {
| |
− | e.cancelBubble = true;
| |
− | return false;
| |
− | }
| |
− |
| |
− |
| |
− | /*
| |
− | Function to define an object storing info on a clickable area for the
| |
− | imagemap.
| |
− | */
| |
− |
| |
− | /*
| |
− | Browser invariant function to get the event "behind" the object passed
| |
− | to event handlers.
| |
− | */
| |
− | function ime_eventGetButton(e) {
| |
− | if (typeof(e.which)!='undefined') {
| |
− | return e.which;
| |
− | }
| |
− | else {
| |
− | return e.button;
| |
− | }
| |
− | }
| |
− |
| |
− | function onmousedown(event) {
| |
− | if (!listenToMouse) return;
| |
− | event.preventDefault();
| |
− | event.stopPropagation();
| |
− | var isLeftButton = event.which == 1, isRightButton = event.which > 1;
| |
− | var offset = $('#imeImg').offset();
| |
− | var x = event.pageX - offset.left;
| |
− | var y = event.pageY - offset.top;
| |
− | var position = { x: parseInt( x / ime_scale ), y: parseInt( y / ime_scale ) };
| |
− | if (isLeftButton) {
| |
− | currentClicks.left = position;
| |
− | }
| |
− | if (isRightButton) {
| |
− | currentClicks.right = position;
| |
− | }
| |
− | ime_saveArea(isLeftButton);
| |
− | }
| |
− |
| |
− | function ime_mouseEventClear() {
| |
− | listenToMouse = false;
| |
− | currentClicks = {};
| |
− | jcanvas.css({ cursor: '' });
| |
− | }
| |
− |
| |
− | function ime_mouseEventSet() {
| |
− | listenToMouse = true;
| |
− | jcanvas.css({ cursor: 'crosshair' });
| |
− | }
| |
− |
| |
− | function ime_newArea(shape) {
| |
− | ime_mouseEventSet();
| |
− | ime_areas.push( { shape: shape, coords: [], link: '' } );
| |
− | ime_currentlyEditing = ime_areas.length-1;
| |
− | ime_updateAreas();
| |
− | return currentArea();
| |
− | }
| |
− |
| |
− | function ime_updateAreas() {
| |
− | ime_updateSelectArea();
| |
− | ime_editArea(ime_currentlyEditing);
| |
− | ime_updateResult();
| |
− | }
| |
− |
| |
− | function ime_updateResult() {
| |
− | var arr = document.ime.imageDescriptionPos;
| |
− | var imageDescriptionPos = arr[0].value;
| |
− | for (var i=1; i<arr.length; i++) {
| |
− | if (arr[i].checked) {
| |
− | imageDescriptionPos = arr[i].value;
| |
− | break;
| |
− | }
| |
− | }
| |
− |
| |
− | var result = Array();
| |
− | result.push('<imagemap>');
| |
− | result.push(mw.config.get('wgPageName') + '|' + document.ime.imageDescription.value);
| |
− | result.push('');
| |
− | for (var i=0; i<ime_areas.length; i++) {
| |
− | var s = ime_areas[i].shape +
| |
− | ' ' +
| |
− | ime_areas[i].coords.join(' ') +
| |
− | ' [[' +
| |
− | ime_areas[i].link +
| |
− | (ime_areas[i].title ? '|' + ime_areas[i].title : '') +
| |
− | ']]';
| |
− |
| |
− | result.push(s);
| |
− | }
| |
− | result.push('');
| |
− | result.push('desc ' + imageDescriptionPos);
| |
− | result.push('</imagemap>');
| |
− |
| |
− | var preResult = document.getElementById('imeResult');
| |
− |
| |
− | while (preResult.lastChild) {
| |
− | preResult.removeChild(preResult.lastChild);
| |
− | }
| |
− |
| |
− | for (var i=0; i<result.length; i++) {
| |
− | preResult.appendChild(document.createTextNode(result[i]));
| |
− | preResult.appendChild(document.createElement('br'));
| |
− | }
| |
− | ime_updateSelectArea();
| |
− | }
| |
− |
| |
− | function drawAreas() { // this is where the magic is done.
| |
− |
| |
− | function markPoint(point, color) {
| |
− | if (point) {
| |
− | context.beginPath();
| |
− | var arm = 8 / ime_scale;
| |
− | context.moveTo(point.x + arm, point.y);
| |
− | context.lineTo(point.x - arm, point.y);
| |
− | context.moveTo(point.x, point.y + arm);
| |
− | context.lineTo(point.x, point.y - arm);
| |
− | context.strokeStyle = color;
| |
− | context.stroke();
| |
− | context.closePath();
| |
− | }
| |
− | }
| |
− |
| |
− | function drawPoly(coords) {
| |
− | coords = coords.slice();
| |
− | context.moveTo(coords.shift(), coords.shift());
| |
− | while (coords.length)
| |
− | context.lineTo(coords.shift(), coords.shift());
| |
− | }
| |
− |
| |
− | context.clearRect(0, 0, context.canvas.width/ime_scale, context.canvas.height/ime_scale); // prepare for a new day.
| |
− | for (var ind in ime_areas) {
| |
− | var current = ind == ime_currentlyEditing;
| |
− | context.fillStyle = current ? 'rgba(255,255,0,0.4)' : 'rgba(255,0,0,0.4)';
| |
− | var area = ime_areas[ind];
| |
− | var coords = area.coords;
| |
− | context.beginPath();
| |
− | switch (area.shape) {
| |
− | case 'rect':
| |
− | var complete = true;
| |
− | for (var i = 0; i < 4; i++) complete = complete && coords[i];
| |
− | if (complete)
| |
− | drawPoly([coords[0], coords[1], coords[0], coords[3], coords[2], coords[3], coords[2], coords[1]]); break;
| |
− | case 'circle': if (coords.length == 3) {
| |
− | context.arc(coords[0],coords[1],coords[2],0,Math.PI*2);
| |
− | }
| |
− | break;//x,y,r,startAngle,endAngle
| |
− | case 'poly': drawPoly(coords);
| |
− | break;
| |
− | }
| |
− | context.closePath();
| |
− | context.fill();
| |
− | if (current) {
| |
− | context.strokeStyle = 'red';
| |
− | context.stroke();
| |
− | }
| |
− | }
| |
− | markPoint(currentClicks.left, 'red');
| |
− | if (currentArea().shape != 'poly') markPoint(currentClicks.right, 'yellow');
| |
− | }
| |
− |
| |
− | function ime_updateSelectArea() {
| |
− |
| |
− | selectArea.children().remove();
| |
− |
| |
− | for (var i=0; i<ime_areas.length; i++) {
| |
− | var area = ime_areas[i],
| |
− | title = (area.title || area.link || '') + ' [' + area.shape + ']';
| |
− | $('<option>', { value: i })
| |
− | .text(title)
| |
− | .prop({ selected: i == ime_currentlyEditing } )
| |
− | .appendTo(selectArea);
| |
− | }
| |
− | selectArea.prop('selectedIndex', ime_currentlyEditing);
| |
− | }
| |
− |
| |
− | function ime_editArea(index) {
| |
− | $('#imeProps').toggle(false);
| |
− |
| |
− | var area = ime_areas[index];
| |
− | currentClicks = area.clicks || {};
| |
− |
| |
− |
| |
− | if (area) {
| |
− | ime_currentlyEditing = index;
| |
− |
| |
− | $('#imeProps').toggle(true);
| |
− | $('.ime-prop').toggle(false);
| |
− | $('.ime-prop-' + area.shape).toggle(true);
| |
− |
| |
− | ime_mouseEventSet();
| |
− | updateInputs();
| |
− | }
| |
− | drawAreas();
| |
− | }
| |
− |
| |
− | function ime_deleteArea() {
| |
− | ime_mouseEventClear();
| |
− |
| |
− | // Remove element from ime_areas array
| |
− | ime_areas.splice(ime_currentlyEditing,1);
| |
− |
| |
− | if (ime_currentlyEditing>=ime_areas.length) {
| |
− | ime_currentlyEditing = ime_areas.length-1;
| |
− | }
| |
− |
| |
− | ime_updateAreas();
| |
− | if (ime_currentlyEditing >= 0) {
| |
− | ime_editArea(ime_currentlyEditing);
| |
− | }
| |
− | }
| |
− |
| |
− | function updateInputs(fromAreas) {
| |
− |
| |
− | function updateRectInputs(coords) {
| |
− | var lx = $('#ime_areaRectLeft'),
| |
− | ly = $('#ime_areaRectTop'),
| |
− | rx = $('#ime_areaRectRight'),
| |
− | ry = $('#ime_areaRectBottom');
| |
− |
| |
− | lx.val(coords && coords[0] || '');
| |
− | ly.val(coords && coords[1] || '');
| |
− | rx.val(coords && coords[2] || '');
| |
− | ry.val(coords && coords[3] || '');
| |
− | }
| |
− |
| |
− | function updateCircInputs(coords) {
| |
− | var x = $('#ime_areaCircleX'),
| |
− | y = $('#ime_areaCircleY'),
| |
− | radius = $('#ime_areaCircleRadius')
| |
− |
| |
− | x.val(coords && coords[0] || '');
| |
− | y.val(coords && coords[1] || '');
| |
− | radius.val(coords && coords[2] || '');
| |
− | }
| |
− |
| |
− | function updatePolyInputs(coords) {
| |
− | $('#imePropsPolyCoords').val(coords.join(', '));
| |
− | }
| |
− |
| |
− |
| |
− | var area = currentArea();
| |
− | var coords = area.coords;
| |
− | switch (area.shape) {
| |
− | case 'rect' : updateRectInputs(coords); break;
| |
− | case 'circle': updateCircInputs(coords); break;
| |
− | case 'poly' : updatePolyInputs(coords); break;
| |
− | }
| |
− | $('#ime_areaLink').val(area.link || '');
| |
− | $('#ime_areaTitle').val(area.title || '');
| |
− | }
| |
− |
| |
− | function currentArea() {
| |
− | return ime_areas[ime_currentlyEditing];
| |
− | }
| |
− |
| |
− | function ime_saveArea(leftClick) {
| |
− | var area = currentArea();
| |
− | area.link = document.ime.areaLink.value;
| |
− | area.title = document.ime.areaTitle.value;
| |
− | var d = area.clicks = $.extend({}, currentClicks);
| |
− |
| |
− | var full = d.left && d.right;
| |
− | switch (area.shape) {
| |
− | case 'rect':
| |
− | if (d.left) {
| |
− | area.coords[0] = d.left.x; area.coords[1] = d.left.y;
| |
− | }
| |
− | if (d.right) {
| |
− | area.coords[2] = d.right.x; area.coords[3] = d.right.y;
| |
− | }
| |
− | break;
| |
− | case 'circle':
| |
− | if (leftClick) {
| |
− | area.coords[0] = d.left.x; area.coords[1] = d.left.y;
| |
− | }
| |
− | if (full) {
| |
− | var dx = d.left.x - d.right.x,
| |
− | dy = d.left.y - d.right.y;
| |
− | area.coords[2] = parseInt(Math.sqrt(dx*dx + dy*dy));
| |
− | }
| |
− | break;
| |
− | case 'poly':
| |
− | if (leftClick && d.left) {
| |
− | area.coords.push(d.left.x, d.left.y);
| |
− | }
| |
− | break;
| |
− | }
| |
− | updateInputs(full || area.shape == 'poly');
| |
− | ime_updateAreas();
| |
− | }
| |
− |
| |
− | /*
| |
− | Remove all UI elements that might interfere with ImageMapEdit.
| |
− | */
| |
− | function ime_removeOtherUIElements() {
| |
− | // Remove all UI elements of the 'annotations' feature used on Wikimedia
| |
− | // Commons.
| |
− | $('#ImageAnnotationAddButton').remove();
| |
− | }
| |
− |
| |
− | /*
| |
− | Try to find an <a> tag within the specified HTML document node.
| |
− | */
| |
− |
| |
− | function ime_findATag(node) {
| |
− | // We just look at the first child until there is none or it is an <a> tag
| |
− | var a = node;
| |
− | while (a != null && a.nodeName.toUpperCase() != 'A') {
| |
− | a = a.firstChild;
| |
− | }
| |
− | return a;
| |
− | }
| |
− |
| |
− | function ime_importLines(toclear) {
| |
− | var text = document.ime.importText.value;
| |
− | var lines = text.split("\n");
| |
− |
| |
− | if (toclear) {
| |
− | ime_areas = [];
| |
− | }
| |
− |
| |
− | for (var i=0; i<lines.length; i++) {
| |
− | var rectMatch = /^rect +(\d+) +(\d+) +(\d+) +(\d+) +\[\[([^|]*)(|(.*))?\]\]/i;
| |
− | var circleMatch = /^circle +(\d+) +(\d+) +(\d+) +\[\[([^|]*)(|(.*))?\]\]/i;
| |
− | var polyMatch = /^poly +(.*?) +\[\[([^|]*)(|(.*))?\]\]/i;
| |
− |
| |
− | var line = lines[i];
| |
− |
| |
− | if (rectMatch.test(line)) {
| |
− | var results = rectMatch.exec(line);
| |
− | var area = ime_newArea("rect");
| |
− | area.coords = results.slice(1, 5);
| |
− | area.link = results[5];
| |
− | if (results[6]) area.title = results[6].substring(1);
| |
− | }
| |
− | else if (circleMatch.test(line)) {
| |
− | var results = circleMatch.exec(line);
| |
− | var area = ime_newArea("circle");
| |
− | area.coords = results.slice(1, 4);
| |
− | area.link = results[4];
| |
− | if (results[5]) area.title = results[5].substring(1);
| |
− | }
| |
− | else if (polyMatch.test(line)) {
| |
− | var results = polyMatch.exec(line);
| |
− | var area = ime_newArea("poly");
| |
− | area.coords = results[1].split(/\s/);
| |
− | area.link = results[2];
| |
− | if (results[3]) area.title = results[3].substring(1);
| |
− | }
| |
− | }
| |
− | ime_updateAreas();
| |
− | }
| |
− |
| |
− | function ime_showImport() {
| |
− | $('#imeImport').show();
| |
− | $('#imeImportShow').hide();
| |
− | $('#imeImportHide').show();
| |
− | }
| |
− |
| |
− | function ime_hideImport() {
| |
− | $('#imeImport').hide();
| |
− | $('#imeImportShow').show();
| |
− | $('#imeImportHide').hide();
| |
− | }
| |
− |
| |
− | function attachTemplate() {
| |
− | $('.ime_t_rect').click(function(e) { e.preventDefault(); ime_newArea('rect'); } );
| |
− | $('.ime_t_circle').click(function(e) { e.preventDefault(); ime_newArea('circle'); } );
| |
− | $('.ime_t_poly').click(function(e) { e.preventDefault(); ime_newArea('poly'); } );
| |
− | $('#ime_areaselector').change(function(e) { ime_editArea($(this).prop('selectedIndex')); });
| |
− | $('.ime_t_deletearea').click(function(e) { e.preventDefault(); ime_deleteArea();});
| |
− | $('#imeImportShow').click(function(e) { e.preventDefault(); ime_showImport();});
| |
− | $('#imeImportHide').click(function(e) { e.preventDefault(); ime_hideImport();});
| |
− | $('.ime_t_import').click(function(e) { e.preventDefault(); ime_importLines();});
| |
− | $('.ime_t_replace').click(function(e) { e.preventDefault(); ime_importLines(true);});
| |
− | $('.ime_saveonchange').change(ime_saveArea);
| |
− | $('.ime-updateresultsonchange').change(ime_updateResult);
| |
− | $('#ime_areaLink').change(function() { currentArea().link = $(this).val(); ime_updateResult();});
| |
− | $('#ime_areaTitle').change(function() { currentArea().title = $(this).val(); ime_updateResult();});
| |
− | $('.ime_t_deletecoordinates').click(function(e) {
| |
− | e.preventDefault();
| |
− | currentArea().coords = [];
| |
− | currentClicks = {};
| |
− | ime_saveArea();
| |
− | } );
| |
− | selectArea = $('#ime_areaselector');
| |
− | $('.ime-savepolyonout').focusout(function() {
| |
− | var val = $(this).val();
| |
− | var area = currentArea();
| |
− | var coords = val.split(/,/g).map(x => parseInt(x)).filter(x => !isNaN(x));
| |
− | if (coords && coords.length && coords.length % 2 === 0) {
| |
− | area.coords = coords;
| |
− | }
| |
− | ime_saveArea();
| |
− | });
| |
− |
| |
− | $('.ime-saveonchange').focusout(function() {
| |
− | var input = $(this);
| |
− | var ind = input.data('coord');
| |
− | var val = parseInt(input.val());
| |
− | var area = currentArea();
| |
− | var coords = area && area.coords;
| |
− |
| |
− | if (coords && typeof(ind) == 'number' && typeof(val) == 'number' && ! isNaN(val)) {
| |
− | coords[ind] = val;
| |
− | currentClicks = {};
| |
− | ime_saveArea();
| |
− | }
| |
− | });
| |
− | mw.loader.using(['mediawiki.api', 'jquery.ui']).done(function() {
| |
− | $('#ime_areaLink').autocomplete({
| |
− | source: function( request, response ) {
| |
− | new mw.Api().get( {
| |
− | action: 'opensearch',
| |
− | search: request.term,
| |
− | namespace: 0,
| |
− | limit:10
| |
− | }).done(function( data ) {
| |
− | if ( data && data.length > 1 )
| |
− | response( data[1] );
| |
− | }); // done
| |
− | } // source
| |
− | }); // autocomplete
| |
− | }); // using
| |
− | }
| |
− |
| |
− |
| |
− | // this is the one-(very long)-line version of the template, since mw linger does not allow use multiline delimiter (ascii 96), not even in the comment...
| |
− | // formatted version in comment below.
| |
− | // original can be found at https://imagemapedit.toolforge.org/template.php.
| |
− | ime_templateHtml = '<form name="ime" action="" ><fieldset style="margin:0.5ex;padding:0 1ex 1ex"><legend>ImageMapEdit</legend><fieldset style="float:left;margin:0 0.5ex 0.5ex;padding:0 1ex 1ex"><legend style="padding:0 0.5ex" class="ime_t_newarea">Create new area</legend><a style="padding:1px;background:white;color:darkblue" class="ime_t_rect">rect(angle)</a><br /><a style="padding:1px;background:white;color:darkblue" class="ime_t_circle">circle</a><br /><a style="padding:1px;background:white;color:darkblue" class="ime_t_poly">poly(gon)</a></fieldset><fieldset style="float:left;margin:0 0.5ex 0.5ex;padding:0 1ex 1ex"><legend style="padding:0 0.5ex" class="ime_t_editarea">Edit area</legend><select id="ime_areaselector" size="10" style="float:left;height:10em;margin:0.5ex;width:auto;min-width:18em;overflow:auto;" ></select><div id="imeProps" style="float:left;margin:0.5ex;padding:0 1ex 1ex;display:none"><div style="float:left;margin:0.5ex;padding:0 1ex 1ex"><label for="ime_areaLink" class="ime_t_linktarget">Link target</label><br /><input id="ime_areaLink" name="areaLink" style="width:10em" class="ime-saveonchange" /><br /><label for="ime_areaTitle"><span class="ime_t_linktitle">Link title</span> (<span class="ime_t_optional">optional</span>)</label><br /><input id="ime_areaTitle" name="areaTitle" style="width:10em" class="ime-saveonchange" /></div><div id="imePropsRect" class="ime-prop ime-prop-rect" style="float:left;margin:0.5ex;padding:0 1ex 1ex;display:none"><label for="ime_areaRectLeft" class="ime_t_rectleft">First corner</label><br /><input id="ime_areaRectLeft" name="areaRectLeft" data-coord=0 class="ime-saveonchange" style="width:4em" /><input id="ime_areaRectTop" name="areaRectTop" data-coord=1 style="width:4em" class="ime-saveonchange" /><span class="ime_t_rectchoose1">Select with left mouse button</span><br/><label for="ime_areaRectRight" class="ime_t_rectright">Second corner</label><br /><input id="ime_areaRectRight" name="areaRectRight" data-coord=2 style="width:4em" class="ime-saveonchange" /><input id="ime_areaRectBottom" name="areaRectBottom" data-coord=3 style="width:4em" class="ime-saveonchange" /><span class="ime_t_rectchoose2">Select with right mouse button</span></div><div id="imePropsCircle" class="ime-prop ime-prop-circle" style="float:left;margin:0.5ex;padding:0 1ex 1ex;display:none"><label class="ime_t_position">Position</label><br /><input name="areaCircleX" id="ime_areaCircleX" class="ime-saveonchange" data-coord=0 style="width:4em" /><input name="areaCircleY" id="ime_areaCircleY" style="width:4em" data-coord=1 class="ime-saveonchange" /><span class="ime_t_circlechoose1">Select with left mouse button</span><br /><label for="ime_areaCircleRadius" class="ime_t_radius">Radius</label><br /><input id="ime_areaCircleRadius" name="areaCircleRadius" data-coord=2 style="width:4em" class="ime-saveonchange" /><span class="ime_t_circlechoose2">Select with right mouse button</span></div><div id="imePropsPoly" class="ime-prop ime-prop-poly" style="float:left;margin:0.5ex;padding:0 1ex 1ex;display:none"><label class="ime_t_coordinates">Coordinates</label><br /><textarea id="imePropsPolyCoords" style="font-size:0.8em;max-width:20em;height:8em"class="ime-savepolyonout"></textarea><a style="padding:1px;background:white;color:darkblue" class="ime_t_deletecoordinates">Delete all coordinates</a><br /><span class="ime_t_polychoose">Add new corner with left mouse button</span></div><div style="clear:both"></div><a style="padding:1px;background:white;color:darkblue" class="ime_t_deletearea">Delete selected area</a></div><div style="clear:both"></div></fieldset><div style="clear:both"></div><fieldset style="margin:0 0.5ex 0.5ex;padding:0 1ex 1ex"><legend class="ime_t_preferences">General preferences</legend><div style="float:left;margin-right:1em;"><label for="ime_imageDescription" class="ime_t_imagedescription">Image description</label><br /><input id="ime_imageDescription" name="imageDescription" class="ime-updateresultsonchange" /></div><div style="float:left"><label style="display:block" class="ime_t_infolinkposition">Position of information link</label><div style="float:left"><input type="radio" name="imageDescriptionPos" value="bottom-left" class="ime-updateresultsonchange" checked="checked" id="ime_imageDescriptionPos_bottomleft" /><label for="ime_imageDescriptionPos_bottomleft"><span class="ime_t_bottomleft">Bottom left</span> (<span class="ime_t_default">default</span>)</label></div><div style="float:left"><input type="radio" name="imageDescriptionPos" value="bottom-right" class="ime-updateresultsonchange" id="ime_imageDescriptionPos_bottomright" /><label for="ime_imageDescriptionPos_bottomright" class="ime_t_bottomright">Bottom right</label></div><div style="float:left"><input type="radio" name="imageDescriptionPos" value="top-left" class="ime-updateresultsonchange" id="ime_imageDescriptionPos_topleft" /><label for="ime_imageDescriptionPos_topleft" class="ime_t_topleft">Top left</label></div><div style="float:left"><input type="radio" name="imageDescriptionPos" value="top-right" class="ime-updateresultsonchange" id="ime_imageDescriptionPos_topright" /><label for="ime_imageDescriptionPos_topright" class="ime_t_topright">Top right</label></div><div style="float:left"><input type="radio" name="imageDescriptionPos" value="none" class="ime-updateresultsonchange" id="ime_imageDescriptionPos_none" /><label for="ime_imageDescriptionPos_none" class="ime_t_nolink">No link</label></div></div><div style="clear:both"></div></fieldset><fieldset style="margin:0.5ex;padding:0 1ex 1ex"><legend class="ime_t_importareas">Import areas from wikicode</legend><a style="padding:1px;background:white;color:darkblue" id="imeImportShow"><span class="ime_t_showtextbox">Show text box</span> ></a><a style="padding:1px;background:white;color:darkblue;display:none" id="imeImportHide"><span class="ime_t_hidetextbox">Hide text box</span> <</a><div id="imeImport" style="display:none"><textarea name="importText" style="width:100%;margin:0;height:10em;display:block"></textarea><a style="padding:0 2em;background:white;color:darkblue" class="ime_t_import">Import</a><a style="padding:0 2em;background:white;color:darkblue" class="ime_t_replace">Replace</a></div></fieldset><fieldset style="margin:0.5ex;padding:0 1ex 1ex"><legend class="ime_t_generatedwikicode">Generated wikicode</legend><div><code id="imeResult" style="display:block;line-height:1.2em"></code></div></fieldset></fieldset></form>';
| |
− | });
| |
− | /*
| |
− | <form name="ime" action="">
| |
− | <fieldset style="margin:0.5ex;padding:0 1ex 1ex">
| |
− | <legend>ImageMapEdit</legend>
| |
− | <fieldset style="float:left;margin:0 0.5ex 0.5ex;padding:0 1ex 1ex">
| |
− | <legend style="padding:0 0.5ex" class="ime_t_newarea">Create new area</legend>
| |
− | <a style="padding:1px;background:white;color:darkblue" class="ime_t_rect">rect(angle)</a>
| |
− | <br />
| |
− | <a style="padding:1px;background:white;color:darkblue" class="ime_t_circle">circle</a>
| |
− |
| |
− | <br />
| |
− | <a style="padding:1px;background:white;color:darkblue" class="ime_t_poly">poly(gon)</a>
| |
− | </fieldset>
| |
− | <fieldset style="float:left;margin:0 0.5ex 0.5ex;padding:0 1ex 1ex">
| |
− | <legend style="padding:0 0.5ex" class="ime_t_editarea">Edit area</legend>
| |
− | <select id="ime_areaselector" size="10" style="float:left;height:10em;margin:0.5ex;width:auto;min-width:18em;overflow:auto;" ></select>
| |
− |
| |
− | <div id="imeProps" style="float:left;margin:0.5ex;padding:0 1ex 1ex;display:none">
| |
− | <div style="float:left;margin:0.5ex;padding:0 1ex 1ex">
| |
− |
| |
− | <label for="ime_areaLink" class="ime_t_linktarget">Link target</label>
| |
− | <br />
| |
− | <input id="ime_areaLink" name="areaLink" style="width:10em" class="ime-saveonchange" />
| |
− | <br />
| |
− | <label for="ime_areaTitle"><span class="ime_t_linktitle">Link title</span> (<span class="ime_t_optional">optional</span>)</label>
| |
− | <br />
| |
− |
| |
− | <input id="ime_areaTitle" name="areaTitle" style="width:10em" class="ime-saveonchange" />
| |
− | </div>
| |
− | <div id="imePropsRect" class="ime-prop ime-prop-rect" style="float:left;margin:0.5ex;padding:0 1ex 1ex;display:none">
| |
− | <label for="ime_areaRectLeft" class="ime_t_rectleft">First corner</label>
| |
− | <br />
| |
− | <input id="ime_areaRectLeft" name="areaRectLeft" data-coord=0 class="ime-saveonchange" style="width:4em" />
| |
− | <input id="ime_areaRectTop" name="areaRectTop" data-coord=1 style="width:4em" class="ime-saveonchange" />
| |
− |
| |
− | <span class="ime_t_rectchoose1">Select with left mouse button</span>
| |
− | <br/>
| |
− | <label for="ime_areaRectRight" class="ime_t_rectright">Second corner</label>
| |
− | <br />
| |
− | <input id="ime_areaRectRight" name="areaRectRight" data-coord=2 style="width:4em" class="ime-saveonchange" />
| |
− | <input id="ime_areaRectBottom" name="areaRectBottom" data-coord=3 style="width:4em" class="ime-saveonchange" />
| |
− | <span class="ime_t_rectchoose2">Select with right mouse button</span>
| |
− |
| |
− | </div>
| |
− | <div id="imePropsCircle" class="ime-prop ime-prop-circle" style="float:left;margin:0.5ex;padding:0 1ex 1ex;display:none">
| |
− | <label class="ime_t_position">Position</label>
| |
− | <br />
| |
− | <input name="areaCircleX" id="ime_areaCircleX" class="ime-saveonchange" data-coord=0 style="width:4em" />
| |
− | <input name="areaCircleY" id="ime_areaCircleY" style="width:4em" data-coord=1 class="ime-saveonchange" />
| |
− | <span class="ime_t_circlechoose1">Select with left mouse button</span>
| |
− | <br />
| |
− |
| |
− | <label for="ime_areaCircleRadius" class="ime_t_radius">Radius</label>
| |
− | <br />
| |
− | <input id="ime_areaCircleRadius" name="areaCircleRadius" data-coord=2 style="width:4em" class="ime-saveonchange" />
| |
− | <span class="ime_t_circlechoose2">Select with right mouse button</span>
| |
− | </div>
| |
− | <div id="imePropsPoly" class="ime-prop ime-prop-poly" style="float:left;margin:0.5ex;padding:0 1ex 1ex;display:none">
| |
− | <label class="ime_t_coordinates">Coordinates</label>
| |
− |
| |
− | <br />
| |
− | <textarea id="imePropsPolyCoords" style="font-size:0.8em;max-width:20em;;height:8em" class="ime-savepolyonout"></textarea>
| |
− | <a style="padding:1px;background:white;color:darkblue" class="ime_t_deletecoordinates">Delete all coordinates</a>
| |
− | <br />
| |
− | <span class="ime_t_polychoose">Add new corner with left mouse button</span>
| |
− | </div>
| |
− | <div style="clear:both"></div>
| |
− | <a style="padding:1px;background:white;color:darkblue" class="ime_t_deletearea">Delete selected area</a>
| |
− |
| |
− | </div>
| |
− | <div style="clear:both"></div>
| |
− | </fieldset>
| |
− | <div style="clear:both"></div>
| |
− | <fieldset style="margin:0 0.5ex 0.5ex;padding:0 1ex 1ex">
| |
− | <legend class="ime_t_preferences">General preferences</legend>
| |
− | <div style="float:left;margin-right:1em;">
| |
− | <label for="ime_imageDescription" class="ime_t_imagedescription">Image description</label>
| |
− |
| |
− | <br />
| |
− | <input id="ime_imageDescription" name="imageDescription" class="ime-updateresultsonchange" />
| |
− | </div>
| |
− | <div style="float:left">
| |
− | <label style="display:block" class="ime_t_infolinkposition">Position of information link</label>
| |
− | <div style="float:left">
| |
− | <input type="radio" name="imageDescriptionPos" value="bottom-left" class="ime-updateresultsonchange" checked="checked" id="ime_imageDescriptionPos_bottomleft" /><label for="ime_imageDescriptionPos_bottomleft"><span class="ime_t_bottomleft">Bottom left</span> (<span class="ime_t_default">default</span>)</label>
| |
− |
| |
− | </div>
| |
− | <div style="float:left">
| |
− | <input type="radio" name="imageDescriptionPos" value="bottom-right" class="ime-updateresultsonchange" id="ime_imageDescriptionPos_bottomright" /><label for="ime_imageDescriptionPos_bottomright" class="ime_t_bottomright">Bottom right</label>
| |
− | </div>
| |
− | <div style="float:left">
| |
− | <input type="radio" name="imageDescriptionPos" value="top-left" class="ime-updateresultsonchange" id="ime_imageDescriptionPos_topleft" /><label for="ime_imageDescriptionPos_topleft" class="ime_t_topleft">Top left</label>
| |
− | </div>
| |
− | <div style="float:left">
| |
− |
| |
− | <input type="radio" name="imageDescriptionPos" value="top-right" class="ime-updateresultsonchange" id="ime_imageDescriptionPos_topright" /><label for="ime_imageDescriptionPos_topright" class="ime_t_topright">Top right</label>
| |
− | </div>
| |
− | <div style="float:left">
| |
− | <input type="radio" name="imageDescriptionPos" value="none" class="ime-updateresultsonchange" id="ime_imageDescriptionPos_none" /><label for="ime_imageDescriptionPos_none" class="ime_t_nolink">No link</label>
| |
− | </div>
| |
− | </div>
| |
− | <div style="clear:both"></div>
| |
− | </fieldset>
| |
− |
| |
− | <fieldset style="margin:0.5ex;padding:0 1ex 1ex">
| |
− | <legend class="ime_t_importareas">Import areas from wikicode</legend>
| |
− | <a style="padding:1px;background:white;color:darkblue" id="imeImportShow"><span class="ime_t_showtextbox">Show text box</span> ></a>
| |
− | <a style="padding:1px;background:white;color:darkblue;display:none" id="imeImportHide"><span class="ime_t_hidetextbox">Hide text box</span> <</a>
| |
− | <div id="imeImport" style="display:none">
| |
− | <textarea name="importText" style="width:100%;margin:0;height:10em;display:block"></textarea>
| |
− |
| |
− | <a style="padding:0 2em;background:white;color:darkblue" class="ime_t_import">Import</a>
| |
− | <a style="padding:0 2em;background:white;color:darkblue" class="ime_t_replace">Replace</a>
| |
− | </div>
| |
− | </fieldset>
| |
− | <fieldset style="margin:0.5ex;padding:0 1ex 1ex">
| |
− | <legend class="ime_t_generatedwikicode">Generated wikicode</legend>
| |
− | <div>
| |
− | <code id="imeResult" style="display:block;line-height:1.2em"></code>
| |
− | </div>
| |
− |
| |
− | </fieldset>
| |
− | </fieldset>
| |
− | </form>
| |
− | `;
| |
− |
| |
− | });
| |
− | */
| |