Category
You're no bot and a page you've created got automatically deleted? Add your name to FreewarWiki:NoSpamUser |
MediaWiki:CompleteMap.js
From FreewarWiki
Note:
After saving, you may have to bypass your browser's cache to see the changes.
After saving, you may have to bypass your browser's cache to see the changes.
- Mozilla / Firefox / Safari: hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (Command-R on a Macintosh);
- Konqueror: click Reload or press F5;
- Opera: clear the cache in Tools → Preferences;
- Internet Explorer: hold Ctrl while clicking Refresh, or press Ctrl-F5.
// Code for the [[CompleteMap]] // Include in [[MediaWiki:CompleteMap.js]]<nowiki> var routermode = false, routerloaded = false; var offsetX, offsetY, prefix = '', oldprefix; // Metadata-"Cache" var prefixes = Object(), crossmods = Array(), oldcrossmod = Object(); var TopLeftXs = Object(), TopLeftYs = Object(), OffsetXs = Object(), OffsetYs = Object(); function map_click(event) { if (this.id == 'map_horz' || this.id == 'map_vert') prefix = oldprefix; else if (this.id.substr(0, 8) == 'map_img_') prefix = this.id.substr(8); else prefix = ''; offsetX = TopLeftXs[prefix + 'TopLeftX'] - 1; offsetY = TopLeftYs[prefix + 'TopLeftY'] - 1; var crossprefix = (routermode && document.map_form.map_radio[1].checked ? 'map_dest_' : 'map_'); var offX; var offY; if (window.event) // Internet Explorer, Opera, Konqueror, Safari { offX = window.event.offsetX; offY = window.event.offsetY; } else { offX = event.layerX; offY = event.layerY; } document.map_form.elements[crossprefix + 'x'].value = Number(this.id == 'map_vert' || this.id == 'map_dest_vert' ? document.map_form.elements[this.id.substr(0, this.id.length - 4) + 'x'].value : Math.floor((offX - 2) / 15) + offsetX + Number(!oldcrossmod[this.id.substr(0, this.id.length - 4)] ? 0 : oldcrossmod[this.id.substr(0, this.id.length - 4)][4])); document.map_form.elements[crossprefix + 'y'].value = Number(this.id == 'map_horz' || this.id == 'map_dest_horz' ? document.map_form.elements[this.id.substr(0, this.id.length - 4) + 'y'].value : Math.floor((offY - 2) / 15) + offsetY + Number(!oldcrossmod[this.id.substr(0, this.id.length - 4)] ? 0 : oldcrossmod[this.id.substr(0, this.id.length - 4)][6])); show_map_position(crossprefix); if (routermode) find_way(); oldprefix = prefix; } function get_coords_position(str, x, y) { // Auxiliary function: determining position of "x,y" in str, so that before and after the result no digit stands. if (str.indexOf(' ' + x + ',' + y + ';') > -1) return str.indexOf(' ' + x + ',' + y + ';') + 1; else if (str.indexOf(' ' + x + ',' + y + '<') > -1) return str.indexOf(' ' + x + ',' + y + '<') + 1; else if (str.indexOf('}' + x + ',' + y + ';') > -1) return str.indexOf('}' + x + ',' + y + ';') + 1; else return str.indexOf('}' + x + ',' + y + '<') + 1; } function show_map_position(crossprefix) { var map_horz = document.getElementById(crossprefix + 'horz'); var map_vert = document.getElementById(crossprefix + 'vert'); var area = area_map_position(document.map_form.elements[crossprefix + 'x'].value, document.map_form.elements[crossprefix + 'y'].value); if (prefix == '?') { if (document.getElementById('prefix' + area.replace(/\s/g, '_'))) prefix = document.getElementById('prefix' + area.replace(/\s/g, '_')).firstChild.nodeValue; else prefix = ''; offsetX = TopLeftXs[prefix + 'TopLeftX'] - 1; offsetY = TopLeftYs[prefix + 'TopLeftY'] - 1; } var map_out_area = document.getElementById('map_out_area'); var map_out_place = document.getElementById('map_out_place'); if (area != '' || routermode) { map_out_area.firstChild.href = '/index.php/' + area; map_out_area.firstChild.firstChild.nodeValue = area; map_out_area.firstChild.nextSibling.nextSibling.href = '/index.php/Map:' + area; place = place_map_position(document.map_form.elements[crossprefix + 'x'].value, document.map_form.elements[crossprefix + 'y'].value); if (place != '') { map_out_place.firstChild.nextSibling.firstChild.nodeValue = place; map_out_place.firstChild.nextSibling.href = '/index.php/' + place; map_out_place.style.display = 'inline'; } else map_out_place.style.display = 'none'; map_out_area.style.visibility = 'visible'; } else map_out_area.style.visibility = 'hidden'; if (area == '' || document.map_form.elements[crossprefix + 'x'].value < 1 || document.map_form.elements[crossprefix + 'y'].value < 1) { map_horz.style.display = 'none'; map_vert.style.display = 'none'; return false; } var imgOffsetX = Number(OffsetXs[prefix + 'OffsetX']); var imgOffsetY = Number(OffsetYs[prefix + 'OffsetY']); var mod_left = 0, mod_top = 0, mod_width = 0, mod_height = 0; oldcrossmod[crossprefix] = null; for (var i in crossmods) { var mod = crossmods[i].split('|'); if (Number(document.map_form.elements[crossprefix + 'x'].value) >= mod[0] && Number(document.map_form.elements[crossprefix + 'x'].value) <= mod[2] && Number(document.map_form.elements[crossprefix + 'y'].value) >= mod[1] && Number(document.map_form.elements[crossprefix + 'y'].value) <= mod[3]) { mod_left = Number(mod[4]); mod_width = Number(mod[5]); mod_top = Number(mod[6]); mod_height = Number(mod[7]); oldcrossmod[crossprefix] = mod; break; } } map_horz.style.left = String((imgOffsetX + mod_left) * 15) + 'px'; map_vert.style.top = String((imgOffsetY + mod_top) * 15) + 'px'; map_horz.style.width = String((mod_width ? mod_width : (document.getElementById(prefix + 'BottomRightX').firstChild.nodeValue - TopLeftXs[prefix + 'TopLeftX'] + 3)) * 15) + 'px'; map_vert.style.height = String((mod_height ? mod_height : (document.getElementById(prefix + 'BottomRightY').firstChild.nodeValue - TopLeftYs[prefix + 'TopLeftY'] + 3)) * 15) + 'px'; map_horz.style.top = String((Number(document.map_form.elements[crossprefix + 'y'].value) + imgOffsetY - Number(offsetY)) * 15) + 'px'; map_vert.style.left = String((Number(document.map_form.elements[crossprefix + 'x'].value) + imgOffsetX - Number(offsetX)) * 15) + 'px'; map_horz.style.display = 'block'; map_vert.style.display = 'block'; return false; } function press_map_button() { prefix = '?'; show_map_position('map_'); if (routermode) { prefix = '?'; show_map_position('map_dest_'); find_way(); } return false; } function init_map() { var map_nav = document.getElementById('map_nav'); if (map_nav) { map_nav.getElementsByTagName('big')[0].style.display = 'none'; var map_form, map_x, map_y, map_submit, map_maplink, map_link_img; map_form = document.createElement('form'); map_form.name = 'map_form'; map_form.onsubmit = press_map_button; map_nav.insertBefore(map_form, map_nav.firstChild); map_form.appendChild(map_nav.getElementsByTagName('table')[0]); map_x = document.createElement('input'); map_y = document.createElement('input'); map_x.type = 'text'; map_y.type = 'text'; map_x.id = 'map_x'; map_y.id = 'map_y'; map_x.size = '3'; map_y.size = '3'; map_x.style.textAlign = 'right'; map_y.style.textAlign = 'right'; with (document.getElementById('map_start')) { appendChild(document.createTextNode('X: ')); appendChild(map_x); appendChild(document.createTextNode(' Y: ')); appendChild(map_y); } map_submit = document.createElement('input'); map_submit.type = 'submit'; map_submit.value = 'OK'; document.getElementById('map_button').appendChild(map_submit); map_maplink = document.createElement('a'); map_link_img = document.createElement('img'); map_link_img.src = 'http://www.fwwiki.org/images/0/03/12px-Earth.png'; map_link_img.border = '0'; map_maplink.appendChild(map_link_img); document.getElementById('map_out_area').appendChild(map_maplink); n = document.getElementById('map').firstChild; do { if (n.nodeName == 'DIV') n.onclick = map_click; } while (n = n.nextSibling); init_map_metadata(document.getElementById('metadata')); document.getElementById('map_link_normal').firstChild.href = 'javascript:switch_mode(0);'; document.getElementById('map_link_normal').style.display = 'inline'; document.getElementById('map_link_router').firstChild.href = 'javascript:switch_mode(1);'; document.getElementById('map_link_router').style.display = 'inline'; document.getElementById('map_dest').firstChild.style.display = 'none'; } } function init_map_metadata(n) { n = n.firstChild; do { if (n.id) { if (n.id.substr(0, 6) == 'prefix') prefixes[n.id] = n.firstChild.nodeValue; if (n.id.substr(n.id.length - 8) == 'TopLeftX') TopLeftXs[n.id] = n.firstChild.nodeValue; if (n.id.substr(n.id.length - 8) == 'TopLeftY') TopLeftYs[n.id] = n.firstChild.nodeValue; if (n.id.substr(n.id.length - 7) == 'OffsetX') OffsetXs[n.id] = n.firstChild.nodeValue; if (n.id.substr(n.id.length - 7) == 'OffsetY') OffsetYs[n.id] = n.firstChild.nodeValue; } switch (n.className) { case 'crossmod': crossmods[crossmods.length] = n.firstChild.nodeValue; break; } // Recursion, because it can give wrapping <p> and <pre> tags. if (n.tagName) init_map_metadata(n); } while (n = n.nextSibling); } function switch_mode(mode) { if (mode == routermode) return; routermode = mode; var tmp = document.getElementById('map_link_normal').parentNode.getAttribute('style'); document.getElementById('map_link_normal').parentNode.setAttribute('style', document.getElementById('map_link_router').parentNode.getAttribute('style')); document.getElementById('map_link_router').parentNode.setAttribute('style', tmp); if (mode == 1 && !routerloaded) init_router(); document.getElementById('map_dest').style.display = (mode == 1 ? 'block' : 'none'); document.getElementById('map_tools').style.display = (mode == 1 ? 'block' : 'none'); document.getElementById('map_out_route').style.display = (mode == 1 ? 'inline' : 'none'); document.getElementById('map_out_area').style.display = (mode == 1 ? 'none' : 'inline'); document.getElementById('map_label_start').style.display = (mode == 1 ? 'inline' : 'none'); document.getElementById('map_label_dest').style.display = (mode == 1 ? 'inline' : 'none'); document.getElementById('map_label_mouse').style.display = (mode == 1 ? 'inline' : 'none'); document.getElementById('map_path').style.display = (mode == 1 ? 'inline' : 'none'); document.getElementById('map_dest_horz').style.display = document.getElementById('map_dest_vert').style.display = (mode == 1 && document.map_form.elements['map_dest_x'].value > 0 && document.map_form.elements['map_dest_y'].value > 0 && area_map_position(document.map_form.elements['map_dest_x'].value, document.map_form.elements['map_dest_y'].value) ? 'block' : 'none'); if (!mode) press_map_button(); } function area_map_position(x, y) { // Zumindest FF teilt Textknoten nach 2^12 Zeichen, also alle Kindknoten aneinanderreihen var ret = '', n = document.getElementById('coordlist').firstChild; do { ret = ret + n.nodeValue; } while (n = n.nextSibling); ret = ret.substring(0, get_coords_position(ret, x, y)); ret = ret.substring(ret.lastIndexOf('{') + 13); // 13 is the length of "arealink|" + 1 ret = ret.substring(0, ret.indexOf('}')); return ret; } function place_map_position(x, y) { // Zumindest FF teilt Textknoten nach 2^12 Zeichen, also alle Kindknoten aneinanderreihen var ret = '', n = document.getElementById('sitelist').firstChild; do { ret = ret + n.nodeValue; } while (n = n.nextSibling); ret = ret.substring(0, get_coords_position(ret, x, y)); ret = ret.substring(ret.lastIndexOf('[') + 1); ret = ret.substring(0, ret.indexOf(']')); return ret; } addOnloadHook(init_map); // </nowiki>