MediaWiki:Gadget-WikiMiniAtlas.js

/******************************************************************************/

/**** THIS PAGE TRACKS meta:MediaWiki:Wikiminiatlas.js. PLEASE AVOID EDITING DIRECTLY.

/**** EDITS SHOULD BE PROPOSED DIRECTLY to meta:MediaWiki:Wikiminiatlas.js.

/**** A BOT WILL RAISE AN EDIT REQUEST IF IT BECOMES DIFFERENT FROM UPSTREAM.

/******************************************************************************/

// WikiMiniAtlas

// Script to embed interactive maps into pages that have coordinate templates

// also check my user page User:Dschwen for more tools

//

// Revision 16.11

// Source: https://github.com/dschwen/wikiminiatlas/blob/master/wikiminiatlas.js

/* jshint laxcomma:true, smarttabs:true, quotmark:single, curly:false, es3:true, browser:true */

/* global mw,jQuery */

jQuery(function ($) {

// WMA config

var wc = {

width : 600,

height : 400,

timeout : 5000,

zoom : -1,

enabled : true,

onlytitle : false,

flowTextTooltips: (location.host==='en.wikipedia.org'),

alwaysTooltips: false,

iframeurl : '//wma.wmcloud.org/iframe.html',

imgbase : '//wma.wmcloud.org/tiles/',

buttonImage: '//upload.wikimedia.org/wikipedia/commons/thumb/5/55/WMA_button2b.png/17px-WMA_button2b.png',

buttonImage2x: '//upload.wikimedia.org/wikipedia/commons/thumb/5/55/WMA_button2b.png/34px-WMA_button2b.png'

},

strings = {

buttonTooltip : {

'af':'Vertoon ligging op \'n interaktiwe kaart.',

'als':'Ort uf dr interaktivä Chartä zeigä',

'ar':'شاهد الموقع على الخريطة التفاعلية',

'ast':'Ver el llugar nun mapa interactivu',

'az':'Yeri interaktiv bir xəritədə göstər',

'bar':'Ort af da interaktivn Kartn zoagn',

'be-tarask':'паказаць месцазнаходжаньне на інтэрактыўнай мапе',

'be-x-old':'паказаць месцазнаходжаньне на інтэрактыўнай мапе',

'bg':'Покажи местоположението на интерактивната карта',

'bn':'সক্রিয় মানচিত্রে অবস্থান চিহ্নিত করুন',

'bpy':'জীবন্ত মানচিত্রগর মা মাপাহান দেখাদিতই',

'br':'diskouez al lec\'hiadur war ur gartenn etrewezhiat',

'bs':'Prikaži lokaciju na interaktivnoj mapi',

'ca':'Mostra la localització en un mapa interactiu',

'cs':'zobrazit místo na interaktivní mapě',

'da':'vis beliggenhed på interaktivt kort',

'de':'Ort auf interaktiver Karte anzeigen',

'dsb':'Městno na interaktiwnej kórśe zwobrazniś',

'el':'Εμφάνιση τοποθεσίας σε διαδραστικό χάρτη',

'en':'Show location on an interactive map',

'eo':'Montru lokigon sur interaktiva karto',

'es':'Mostrar el lugar en un mapa interactivo',

'eu':'erakutsi kokalekua mapa interaktibo batean',

'fa':'نمایش مکان در نقشه‌ای پویا',

'fi':'näytä paikka interaktiivisella kartalla',

'fr':'Montrer la localisation sur une carte interactive',

'fur':'mostre la localizazion suntune mape interative',

'fy':'it plak op in oanpasbere kaart oanjaan',

'gl':'Amosar o lugar nun mapa interactivo',

'he':'הראה מיקום במפה האינטראקטיבית',

'hi':'सक्रिय नक्शे पर लोकेशन या स्थान दिखायें',

'hr':'Prikaži lokaciju na interaktivnom zemljovidu',

'hsb':'Městno na interaktiwnej karće zwobraznić',

'hu':'Mutasd a helyet egy interaktív térképen!',

'hy':'ցուցադրել դիրքը ինտերակտիվ քարտեզի վրա',

'id':'Tunjukkan lokasi di peta interaktif',

'ilo':'Ipakita ti lokasion iti interaktibo a mapa',

'is':'sýna staðsetningu á gagnvirku korti',

'it':'mostra la località su una carta interattiva',

'ja':'インタラクティブ地図上に位置を表示',

'kk':'интерактивті картадан орналасуын көрсету',

'km':'បង្ហាញទីតាំងនៅលើផែនទីអន្តរកម្ម',

'kn':'ನಕ್ಷೆಯಲ್ಲಿ ಸ್ಥಳವನ್ನು ತೋರಿಸು',

'ko':'인터랙티브 지도에 위치를 표시',

'ku':'Vî cihê li ser nexşeyekî înteraktifê nişan bide',

'lt':'Rodyti vietą interaktyviame žemėlapyje',

'lv':'Rādīt atrašanās vietu interaktīvajā kartē',

'min':'Tunjuakan lokasi pado peta',

'mk':'прикажи положба на интерактивна карта',

'ml':'സ്ഥാനം സംവേദനക്ഷമമായ ഒരു ഭൂപടത്തിൽ കാണിക്കുക',

'ms':'Tunjukkan lokasi pada peta interaktif',

'my':'မြေပုံပေါ်တွင် တည်နေရာပြရန်',

'nl':'de locatie op een interactieve kaart tonen',

'no':'vis beliggenhet på interaktivt kart',

'nv':'kéyah tʼáá dah siʼą́ą́ ńtʼę́ę́ʼ beʼelyaaígíí',

'pl':'Pokaż lokalizację na mapie interaktywnej',

'ps':'د ځاي نخشه ښکاره کول په متقابله نخشه کې',

'pt':'mostrar a localidade num mapa interactivo',

'ro':'Arată locaţia pe o hartă interactivă',

'ru':'показать положение на интерактивной карте',

'sco':'Shaw location on an interactive cairt',

'sh':'Prikaži lokaciju na interaktivnoj mapi',

'sk':'zobraz miesto na interaktívnej mape',

'sl':'Prikaži lego na interaktivnem zemljevidu',

'sq':'trego vendndodhjen në hartë',

'sr':'Прикажи локацију на интерактивној мапи',

'sr-ec':'Прикажи локацију на интерактивној мапи',

'sr-el':'Prikaži lokaciju na interaktivnoj mapi',

'sv':'visa platsen på en interaktiv karta',

'th':'แสดงตำแหน่งบนแผนที่เชิงโต้ตอบ',

'ti': 'ቦታ ኣብ ተገባባሪ ካርታ ኣርእይ',

'tr':'Yeri interaktif bir haritada göster',

'uk':'показати положення на інтерактивній мапі',

'vi':'xem vị trí này trên bản đồ tương tác',

'vo':'Jonön topi su kaed itjäfidik',

'zh':'显示该地在地图上的位置',

'zh-cn':'显示该地在地图上的位置',

'zh-hk':'顯示該地在地圖上的位置',

'zh-sg':'显示该地在地图上的位置',

'zh-tw':'顯示該地在地圖上的位置',

'zh-yue':'顯示當地喺地圖度嘅位置'

},

'map': {

'ast':'Mapa',

'az':'Xəritə',

'bg':'Карта',

'bn':'মানচিত্র',

'bs':'Mapa',

'ca':'Mapa',

'cs':'Mapa',

'de':'Karte',

'el':'Χάρτης',

'en':'Map',

'es':'Mapa',

'fa':'نقشه',

'fi':'Kartalla',

'fr':'Carte',

'gl':'Mapa',

'hr':'Zemljovid',

'hu':'Térkép',

'id':'peta',

'ilo':'Mapa',

'it':'Mappa',

'ja':'地図',

'kn':'ನಕ್ಷೆ',

'ku':'Nexşe',

'min':'peta',

'mk':'Карта',

'ml':'ഭൂപടം',

'ms':'Peta',

'my':'မြေပုံညွှန်း',

'nl':'Kaart',

'ps':'نخشه',

'pt':'Mapa',

'ru':'карте',

'sco':'Cairt',

'sh':'Mapa',

'sr':'Мапа',

'sr-ec':'Мапа',

'sr-el':'Mapa',

'sv':'Karta',

'th':'แผนที่',

'ti':'ካርታ',

'uk':'мапі',

'zh':'地圖',

'zh-cn':'地图',

'zh-hk':'地圖',

'zh-sg':'地图',

'zh-tw':'地圖',

'zh-yue':'地圖'

},

close : {

'af':'Sluit',

'als':'Zuä machä',

'ar':'غلق',

'ast':'zarrar',

'az':'bağla',

'be-tarask':'закрыць',

'be-x-old':'закрыць',

'bar':'zuamachn',

'bg':'Затвори',

'bn':'বন্ধ করুন',

'bpy':'জিপা',

'br':'serriñ',

'bs':'zatvori',

'ca':'Tanca',

'cs':'zavřít',

'da':'luk',

'de':'schließen',

'dsb':'zacyniś',

'el':'έξοδος',

'en':'close',

'eo':'fermu',

'es':'cerrar',

'eu':'itxi',

'fa':'بستن',

'fi':'sulje',

'fr':'Quitter',

'fur':'siere',

'fy':'ticht',

'gl':'pechar',

'he':'לסגור',

'hi':'बंद करें',

'hr':'zatvori',

'hsb':'začinić',

'hu':'bezárás',

'hy':'փակել',

'id':'tutup',

'ilo':'irikep',

'is':'loka',

'it':'chiudi',

'ja':'閉じる',

'kk':'жабу',

'km':'បិទ',

'kn':'ಮುಚ್ಚಿರಿ',

'ko':'닫기',

'ku':'daxe',

'lt':'uždaryti',

'lv':'aizvērt',

'min':'tutuik',

'mk':'затвори',

'ml':'അടയ്ക്കുക',

'ms':'tutup',

'my':'ပိတ်ရန်',

'nl':'sluiten',

'no':'lukk',

'ps':'تړل',

'nv':'doo yishʼį́ nisin da',

'pl':'zamknij',

'pt':'fechar',

'ro':'închide',

'ru':'закрыть',

'sh':'zatvori',

'sk':'zatvoriť',

'sl':'zapri',

'sq':'mbylle',

'sr':'затвори',

'sr-ec':'затвори',

'sr-el':'zatvori',

'sv':'stäng',

'th':'ปิด',

'ti':'ዕጸው',

'tr':'kapat',

'uk':'закрити',

'vi':'đóng',

'vo':'färmükön',

'zh':'关闭',

'zh-cn':'关闭',

'zh-hk':'關閉',

'zh-sg':'关闭',

'zh-tw':'關閉',

'zh-yue':'收埋'

},

resize : {

'ar':'تغيير حجم',

'ast':'redimensionar',

'az':'ölçüləri dəyiş',

'bg':'Промени големина',

'bn':'মাপ পরিবর্তন করুন',

'bs':'promijeni veličinu',

'ca':'Redimensiona',

'cs':'změnit velikost',

'de':'Größe ändern',

'dk':'ændre størrelse',

'el':'αλλαγή μεγέθους',

'en':'resize',

'es':'cambiar el tamaño',

'fa':'تغییر اندازه',

'fi':'muuta kokoa',

'fr':'redimensionner',

'gl':'cambiar o tamaño',

'hr':'promijeni veličinu',

'hu':'átméretezés',

'ilo':'baliwan ti kadakkel',

'it':'ridimensiona',

'ja':'サイズを変更する',

'kk':'өлшемін өзгерту',

'kn':'ಗಾತ್ರ ಬದಲಿಸು',

'min':'gadangan',

'mk':'промени големина',

'ml':'വലിപ്പം മാറ്റുക',

'ms':'ubah saiz',

'my':'အရွယ်အစားညှိရန်',

'nl':'vergroten of verkleinen',

'no':'endre størrelse',

'ps':'د کچې بدلول',

'pt':'alterar tamanho',

'ro':'redimensionare',

'sh':'promijeni veličinu',

'sl':'spremeni velikost',

'sr':'промени величину',

'sr-ec':'промени величину',

'sr-el':'promeni veličinu',

'sv':'ändra storlek',

'th':'ปรับขนาด',

'ti':'መጠን ለውጥ',

'uk':'змінити розмір',

'zh':'调整大小',

'zh-cn':'调整大小',

'zh-hk':'調整大小',

'zh-sg':'调整大小',

'zh-tw':'調整大小',

'zh-yue':'改大細'

}

},

// domain of the WMA

wma_domain = '//wma.wmcloud.org',

language = , site = , awt='0', rtl = /(^|\s)rtl(\s|$)/.test(document.body.className),

// Get a specific, localized string

_msg = function(k) {

return strings[k][language] || strings[k].en;

},

dbName = mw.config.get( 'wgDBname' ),

iframe = { div: null, iframe: null, closebutton: null, resizebutton: null, resizehelper: null, indom: false },

page_title = ( mw.config.get('wgNamespaceNumber')===0 ) ? encodeURIComponent(mw.config.get('wgTitle')) : '',

bodyc,

coord_filter = /[?&]params=([\d.+-]+)_([\d.+-]*)_?([\d.+-]*)_?([NSZ])_([\d.+-]+)_([\d.+-]*)_?([\d.+-]*)_?([EOW])([^&=<>|]{0,250})/,

coord_list = [],

coord_highlight = -1,

kml = null,

mes = null,

initPromises = [];

// get position on page

function yPos(el) {

return $(el).offset().top + $(el).outerHeight();

}

// show, move, and update iframe

function showIFrame(e) {

var wi = iframe, my = yPos(this),

newurl = wc.iframeurl + '?wma=' + e.data.param + '&lang=' + site + '&page=' + page_title + '&awt=' + awt;

// insert iframe into DOM on demand (to preserve page caching)

if (!wi.indom) {

$('#content,#mw_content').prepend(wi.div);

wi.indom = true;

}

if (wi.iframe.attr('src')!==newurl) {

wi.iframe.attr( 'src', newurl );

} else if( wi.div.css('display') !== 'none' ) {

wi.div.hide();

return false;

}

wi.div.css( 'top', my+'px' ).show();

return false;

}

function highlight(i) {

if (coord_highlight>=0) {

$(coord_list[coord_highlight].obj).css('background-color',).find('span:visible').css('background-color',);

}

coord_highlight = i;

if (coord_highlight>=0) {

$(coord_list[coord_highlight].obj).css('background-color','yellow').find('span:visible').css('background-color','yellow');

}

}

function messageHub(e) {

var i, d, clist = { coords: [] }

, geoext = [], sx=0, sy=0, s

, minlat = Infinity, maxlat = -Infinity, ineg = -1, ipos = -1;

e = e.originalEvent;

if (!e || !e.data || !e.data.split) {

// avoid Uncaught TypeError: e.data.split is not a function

return;

}

d = e.data.split(',');

mes = e.source;

switch(d[0]) {

case 'request' :

// make a JSON encodable copy of coord_list (no HTML objects!)

// find center and extent

for (i=0; i

clist.coords[i] = {

lat: coord_list[i].lat,

lon: coord_list[i].lon,

title: coord_list[i].title.replace(/[\+_]/g,' ')

};

if (coord_list[i].lat

if (coord_list[i].lat>maxlat) { maxlat = coord_list[i].lat; }

geoext[i] = {

x: Math.cos(coord_list[i].lon/180.0*Math.PI),

y: Math.sin(coord_list[i].lon/180.0*Math.PI)

};

sx += geoext[i].x;

sy += geoext[i].y;

}

clist.loncenter = Math.atan2(sy,sx)*180.0/Math.PI;

clist.latmax = maxlat;

clist.latmin = minlat;

// extent in longitude

for (i=0; i

s = (geoext[i].x*sy-geoext[i].y*sx);

geoext[i].z = (geoext[i].x*sx+geoext[i].y*sy);

if (s<0 && (ineg<0 || geoext[i].z

if (s>0 && (ipos<0 || geoext[i].z

}

if (ipos>=0 && ineg>=0) {

clist.lonleft = coord_list[ipos].lon;

clist.lonright = coord_list[ineg].lon;

}

if ('JSON' in window) {

mes.postMessage(JSON.stringify(clist), document.location.protocol + wma_domain);

if (kml!==null) {

mes.postMessage(JSON.stringify(kml), document.location.protocol + wma_domain);

}

}

break;

case 'unhighlight' :

highlight(-1);

break;

case 'toggle' :

coord_list[parseInt(d[1],10)].mb.click();

break;

case 'scroll' :

$('html:not(:animated),body:not(:animated)').animate({ scrollTop: $(coord_list[parseInt(d[1],10)].obj).offset().top - 20 + parseInt(d[2]||'0',10) }, 500 );

iframe.div.css( { top: yPos( coord_list[parseInt(d[1],10)].obj ) + 'px'} );

// make sure scroll target gets highlighted

setTimeout(function () { highlight(parseInt(d[1],10)); }, 200);

break;

case 'highlight' :

highlight(parseInt(d[1],10));

break;

}

}

// parse url parameters into a hash

function parseParams(url) {

var map = {}, h, i, pair = url.substr(url.indexOf('?')+1).split('&');

for (i=0; i

h = pair[i].split('=');

map[h[0]] = h[1];

}

return map;

}

// Insert the IFrame into the page.

var wi = iframe,

marker = { lat:0, lon:0 }, coordinates = null,

links, key, startTime, mapbutton;

// apply settings

if (typeof wma_settings==='object') {

for (key in wma_settings) {

if (typeof wma_settings[key]===typeof wc[key]) { wc[key] = wma_settings[key]; }

}

}

if (wc.enabled===false) { return; }

site = (dbName==='commonswiki') ? 'commons' : (mw.config.get('wgUserVariant') || mw.config.get('wgPageContentLanguage'));

language = mw.config.get( 'wgUserLanguage' );

// bhwiki reports bho as language. I do not understand that yet, so let's add an exception

if (site === 'bho') site = 'bh';

// remove icons from title coordinates

$('#coordinates,#coordinates-title,#tpl_Coordinaten').find('a.image, span[typeof*="mw:File"]').detach();

bodyc = $( wc.onlytitle ? '#coordinates,#coordinates-title' : 'html' );

startTime = (new Date()).getTime();

bodyc.find('a.external.text').each( function( key, link ) {

var ws, coord_params, params, zoomlevel, globe='Earth';

// check for timeout (every 10 links only)

if (key%10===9 && (new Date()).getTime() > startTime+wc.timeout) {

return false; // break out of each

}

if (!('href' in link) || !coord_filter.exec(link.href)) { // invalid links do not contain href attribute in IE!

return true;

}

marker.lat=(1.0*RegExp.$1) + ((RegExp.$2||0)/60.0) + ((RegExp.$3||0)/3600.0);

if (RegExp.$4!=='N') { marker.lat*=-1; }

marker.lon=(1.0*RegExp.$5) + ((RegExp.$6||0)/60.0) + ((RegExp.$7||0)/3600.0);

if (RegExp.$8==='W') { marker.lon*=-1; }

coord_params = RegExp.$9;

// Zoom based on coordinate N/S precision

var coord_digits = RegExp.$3 ? 4 : RegExp.$2 ? 2 : RegExp.$1.length - (RegExp.$1+'.').indexOf('.') - 1;

zoomlevel = coord_digits * Math.log(10)/Math.log(2);

// Find a sensible Zoom-level based on type

if( /_type:(airport|edu|pass|landmark|railwaystation)/.test(coord_params) ) {

zoomlevel = 8;

} else if (/_type:(event|forest|glacier)/.test(coord_params)) {

zoomlevel = 6;

} else if (/_type:(adm3rd|city|mountain|isle|river|waterbody)/.test(coord_params)) {

zoomlevel = 4;

}

// wma shows dim approx 4e7m at zoom 0 or 1.5e8 is the scale of zoomlevel 0

if (/_dim:([\d.+-]+)(km|m|_|$)/.exec(coord_params)) {

zoomlevel = Math.log((RegExp.$2==='km' ? 4e4 : 4e7) / RegExp.$1)/Math.log(2);

}

if (/_scale:(\d+)(_|$)/.exec(coord_params)) {

zoomlevel = Math.log(1.5e8/RegExp.$1) / Math.log(2);

}

if (wc.zoom!==-1) { zoomlevel = wc.zoom; }

//if( zoomlevel > 12 ) { zoomlevel = 12; }

if (zoomlevel<0) { zoomlevel = 0; }

function capitalize(s) { return s.substr(0,1).toUpperCase()+s.substr(1).toLowerCase(); }

if (/_globe:([^_&]+)/.test(coord_params)) { globe = capitalize(RegExp.$1); }

if ($.inArray(globe,['Earth','Moon','Mars','Venus','Mercury','Io','Titan']) < 0 ) { return; }

// Test the unicode Symbol

if (site==='de' && link.parentNode.id!=='coordinates') {

mapbutton = $('').css('color','blue');

} else {

mapbutton = $('').attr('src', wc.buttonImage).attr('srcset', wc.buttonImage + ' 1x, ' + wc.buttonImage2x + ' 2x');

}

mapbutton.addClass('wmamapbutton noprint').attr( {

title: _msg('buttonTooltip'),

alt: ''

} )

.on('mouseenter', function (){ $(this).css('opacity', 0.75); })

.on('mouseleave', function () { $(this).css('opacity', ''); })

.css('padding', rtl ? '0px 0px 0px 3px' : '0px 3px 0px 0px' ).css('cursor', 'pointer');

if (wc.alwaysTooltips || ( wc.flowTextTooltips && $(link).parents('li, table, #coordinates').length===0)) {

// insert tooltip rather than icon to improve text readability

mapbutton = $('').append(mapbutton).append(' WikiMiniAtlas').css('cursor','pointer');

var tooltip = $('

').css( {

backgroundColor: 'white', padding: '0.2em', border: '1px solid black',

position: 'absolute', top: '1em', left: '0em',

display: 'none', zIndex : 15

}).append(mapbutton);

$(link).wrap(

$('')

.css( { position: 'relative', whiteSpace: 'nowrap' } )

.on('mouseleave', function () { tooltip.fadeOut(); })

)

.before(tooltip)

.on('mouseenter', function () { tooltip.fadeIn(); });

} else {

// insert icon directly

ws = $(link).css('whiteSpace');

if (site!=='de' || link.parentNode.id!=='coordinates') {

$(link).wrap( $('').css('whiteSpace', 'nowrap') ).css('whiteSpace', ws).before(mapbutton);

} else {

$('#coordinates').append(' | ').append(mapbutton);

}

}

mapbutton.on( 'click', { param:

marker.lat + '_' + marker.lon + '_' +

wc.width + '_' + wc.height + '_' +

site + '_' + zoomlevel + '_' + language + '&globe=' + globe }, showIFrame );

// store coordinates

coordinates = link.href;

params = parseParams(link.href);

coord_list.push( { lat: marker.lat, lon: marker.lon, obj: link, mb: mapbutton, title: params.title || params.pagename || '' } );

} ); //end each

var titlebutton = false;

function addTitleButton( alat, alon, zoomlevel ) {

mapbutton = $('')

.on('mouseenter', function (){ $(this).css('opacity', 0.75); })

.on('mouseleave', function () { $(this).css('opacity', ''); })

.css('padding', rtl ? '0px 3px 0px 0px' : '0px 0px 0px 3px' ).css('cursor', 'pointer')

.attr('src', wc.buttonImage).attr('srcset', wc.buttonImage + ' 1x, ' + wc.buttonImage2x + ' 2x')

.addClass('wmamapbutton noprint')

.on( 'click', { param:

alat + '_' + alon + '_' +

wc.width + '_' + wc.height + '_' +

site + '_' + zoomlevel + '_' + language

}, showIFrame ); // zoomlevel!

if (!titlebutton) {

if ($('#coordinates').length) {

$('#coordinates').find('img').detach();

$('#coordinates').append(mapbutton);

} else {

$('').text(_msg('map')).append(mapbutton).appendTo('#bodyContent');

}

titlebutton = true;

}

}

// detect and load KML

// also insert globe even if no title coords are given

(function () {

var i, l = $('div.kmldata')

,alat = 0, alon = 0

,la1 = Infinity, la2 =- Infinity

,lo1 = Infinity, lo2 =- Infinity

,ex,ey, req;

for (i=0; i

coordinates = true;

req = $.ajax({

url: '/wiki/' + encodeURI(l.eq(i).attr('title')) + '?action=raw',

dataType: 'xml',

success: function (xml) {

var zoomlevel;

function processCoords(t) {

var way = [], c, p = t.split(' '), i, lat, lon;

for( i=0; i

c=p[i].split(',');

if( c.length >= 2 ) {

lat = parseFloat(c[1]);

lon = parseFloat(c[0]);

way.push( { lat: lat, lon: lon } );

// determine extent of way

if (lat

if (lon

if (lat>la2) { la2=lat; }

if (lon>lo2) { lo2=lon; }

}

}

return way;

}

// initialize transfer datastructure

kml = { ways: [], areas: [] };

// ways

$(xml).find('LineString > coordinates').each(function () {

var way = processCoords( $(this).text() );

if (way.length>0) { kml.ways.push(way); }

});

// areas

$(xml).find('Polygon').each(function () {

var area = { inner: [], outer: [] };

// outer boundary

$(this).find('outerBoundaryIs > LinearRing > coordinates').each(function () {

var way = processCoords($(this).text());

if (way.length>0) { area.outer.push(way); }

});

// inner boundary (holes in the polygon)

$(this).find('innerBoundaryIs > LinearRing > coordinates').each(function () {

var way = processCoords($(this).text());

if (way.length>0) { area.inner.push(way); }

});

// only add if we have an outer boundary

if (area.outer.length>0) { kml.areas.push(area); }

});

// inset min/max extent

kml.minlon = lo1;

kml.maxlon = lo2;

kml.minlat = la1;

kml.maxlat = la2;

// already got a request message

if (mes!==null && kml.ways.length>0 && 'JSON' in window) {

mes.postMessage(JSON.stringify(kml), document.location.protocol + wma_domain);

}

// insert blue globe

if (coord_list.length===0 || (!$('#coordinates').find('.wmamapbutton').length)) {

// determine center

alat = (la1+la2)/2;

alon = (lo1+lo2)/2;

//determine zoomfactor

ex = (lo2-lo1)/180.0 * 3.0*128;

ey = (la2-la1)/180.0 * 3.0*128; // max extent in degrees, zoom0 has 3*128/180 px/degree

for (zoomlevel=0; zoomlevel<12; ++zoomlevel) {

if( ex>wc.width/2 || ey>wc.height/2 ) break;

ex *= 2; ey *= 2;

}

// add mapbutton

addTitleButton( alat, alon, zoomlevel );

}

}

});

// Add request promise to init array, and cast any errors to success so that

// we don't abort init early when one of the requests failed. These are expected

// to fail for titles we can't find.

initPromises.push(req.then(null, function () { return $.Deferred().resolve(); } ));

} // end for

})();

// detect "All Coordinates"

links = $('#coordinates>span>a');

if (links.length && links[0].href.indexOf('http://www.lenz-online.de/cgi-bin/wiki/wiki-osm.pl') === 0) {

addTitleButton( 0, 0, 1 );

coordinates = true;

}

// prepare iframe to house the map

if (coordinates!==null) {

wi.div = $('

').css( {

width: (wc.width+2)+'px', height: (wc.height+2)+'px',

margin: '0px', padding: '0px',

backgroundColor : 'white', border: '1px solid gray',

position: 'absolute', top: '1em', zIndex: 13, boxShadow: '3px 3px 25px rgba(0,0,0,0.3)'

} ).css( rtl ? 'left' : 'right', '2em' ).hide();

var rbrtl = [ '//upload.wikimedia.org/wikipedia/commons/b/b5/Button_resize.png',

'//upload.wikimedia.org/wikipedia/commons/3/30/Button_resize_rtl.png' ];

wi.resizebutton = $('').attr( {

title : _msg('resize'),

src : rbrtl[rtl?1:0]

} ).hide().attr('ondragstart','return false');

// cover the iframe to prevent loosing the mouse to the iframe during resizing

wi.resizehelper = $('

').css( { position: 'absolute', top:0, left:0, zIndex: 20 } ).hide();

wi.closebutton = $('').attr( {

title : _msg('close'),

src : '//upload.wikimedia.org/wikipedia/commons/d/d4/Button_hide.png'

} ).css( {

zIndex : 15, position : 'absolute', right : '11px', top : '9px', width : '18px', cursor : 'pointer'

} ).click( function(e) { wi.div.hide(); } );

wi.iframe = $('