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; imaxlat) { 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; i0 && (ipos<0 || geoext[i].z=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<pair.length; ++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= 2 ) { lat = parseFloat(c[1]); lon = parseFloat(c[0]); way.push( { lat: lat, lon: lon } );

// determine extent of way if (latla2) { 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 = $(' ') .attr( { scrolling: 'no', frameBorder : 0 } ) .css( {   zIndex: 14, position: 'absolute', right: '1px', top: '1px',    width: (wc.width)+'px', height: (wc.height)+'px',    margin: '0px', padding: '0px'   } );

wi.div.append(wi.iframe); wi.div.append(wi.resizehelper); wi.div.append(wi.closebutton); (function {   var idle = true, dir = rtl?-1:1;   function adjusthelper {    wi.resizehelper.css( { width: (wc.width+2)+'px', height: (wc.height+2)+'px' } );   }   wi.div.append( $(' ')    .css( {       zIndex : 15, position : 'absolute', bottom : '3px',       width : '18px', height: '18px', cursor : (rtl?'se-resize':'sw-resize'),       'user-select': 'none', '-moz-user-select': 'none', '-ms-user-select': 'none'      } ).css( (rtl?'right':'left'), '3px' ) .on('mouseenter', function(e) { wi.resizebutton.fadeIn; } ) .on('mouseleave', function(e) { if( idle ) { wi.resizebutton.fadeOut; } } ) .on('mousedown', function(e) {      if (idle) {        var lastx = e.pageX, lasty = e.pageY;        wi.resizehelper.show;        adjusthelper;

$('body') .on('mouseup.wmaresize', function(e) {         $('body').off('mousemove.wmaresize');          $('body').off('mouseup.wmaresize');          idle = true;          wi.resizehelper.hide;         } ) .on('mousemove.wmaresize', function(e) {         wc.width -= dir*(e.pageX-lastx);          wc.height += (e.pageY-lasty);          lastx = e.pageX; lasty = e.pageY;          wi.div.css( { width: (wc.width+2)+'px', height: (wc.height+2)+'px' } );          wi.iframe.css( { width: wc.width+'px', height: wc.height+'px' } );          adjusthelper;         } );

idle = false; }     } )     .append(wi.resizebutton)   ); });

$(window).on('message', messageHub);

// Fire event for other code to extend or integrate with WMA if (initPromises.length) { $.when.apply( null, initPromises ).then(function {      mw.hook('WikiMiniAtlas.load').fire;    } ); } else { mw.hook('WikiMiniAtlas.load').fire; } } });

//