User:Evad37/Custom GeoHack replacement.js

Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
/* Use your own custom page instead of the regular GeoHack.
 *
 * It support the following replacement variables found in GeoHack:
 * {latdegdec} {londegdec} {scale} {span} {osmzoom}
 *
 * Based on a script by [[User:Dispenser]]: [[mw:GeoHack/Replacement_script]]
 *
 * Instructions:
 * 1) Add the following line to your common.js (or skin-specific js):
 *      importScript('User:Evad37/Custom_GeoHack_replacement.js'); // [[User:Evad37/Custom_GeoHack_replacement.js]]
 *
 * 2) Create your custom GeoHack user subpage at [[User:YOURUSERNAME/GeoHack]]
 *    - use whatever content and formatting you like
 *    - use the replacement variables above in external links, e.g. for Google Maps use
 *        http://maps.google.com/maps?ll={latdegdec},{londegdec}&spn={span},{span}&q={latdegdec},{londegdec}
 *    - more urls can be found at [[Template:GeoTemplate]]
 *    - see [[User:Evad37/GeoHack]] for an example page
 *
 * 3) Now coordinates will link to this page instead of GeoHack (specifying real values to take the place of
 *    the replacement variables in external links)
 *
 */ 
jQuery( function( $ ) {

	if ( mw.config.get("wgPageName") !== "User:" + mw.config.get("wgUserName") + "/GeoHack" ) {

 		var geohack_base = "//geohack.toolforge.org/geohack.php";
		var coord_filter = /&params=([\d.+-]+)_([\d.+-]*)_?([\d.+-]*)_?([NSZ])_([\d.+-]+)_([\d.+-]*)_?([\d.+-]*)_?([EOW])([^&=]*)/;
		var link, lat, lon, scale;
		$("a[href*='" + geohack_base + "']").each(function() {
			if(coord_filter.exec($(this).attr("href"))) {
				// latitude and longitude
				lat=(1.0*RegExp.$1) + ((RegExp.$2||0)/60.0) + ((RegExp.$3||0)/3600.0);
				if(RegExp.$4!='N') lat*=-1;
				lon=(1.0*RegExp.$5) + ((RegExp.$6||0)/60.0) + ((RegExp.$7||0)/3600.0);
				if(RegExp.$8=='W') lon*=-1;
				
				// Determine scale/zoom
				var params = RegExp.$9;
				if(/_globe:(?!earth|_|$)/i.test(params)) return;
				if(/_type:(adm3rd|city|mountain|isle|river|waterbody)/.test(params))scale = 100000;
				else if(/_type:(event|forest|glacier)/.test(params))scale = 50000;
				else if(/_type:(airport|edu|pass|landmark|railwaystation)/.test(params))scale = 10000;
				else scale = 300000;
				if(/_dim:([\d.+-]+)(km)?m?/.exec(params))scale = RegExp.$1 * (RegExp.$2?10000:10);
				if(/_scale:(\d+)(_|$)/.exec(params))scale = RegExp.$1;
				var osmzoom = 18 - Math.round(Math.log(scale/1693) / Math.log(2));
				var zoom =  Math.log( 1.5e8/scale) / Math.log(2);
				
				$(this).attr("href", "").attr("onclick","window.open(\"https://en.wikipedia.org/wiki/User:Evad37/GeoHack?lat=" + lat +"&lon=" + lon + "&scale=" + scale + "&span=" + span + "&osmzoom=" + osmzoom + "&zoom=" + zoom +"\")");
			}
		});

	} else if ( mw.util.getParamValue( 'lat' ) ) {

		var lat = mw.util.getParamValue( 'lat' );
		var lon = mw.util.getParamValue( 'lon' );
		var scale = mw.util.getParamValue( 'scale' );
		var span = mw.util.getParamValue( 'span' );
		var osmzoom = mw.util.getParamValue( 'osmzoom' );
		var zoom = mw.util.getParamValue( 'zoom' );

		$("a.external").each(function() {
			var old_url = $(this).attr("href");
			var replacement_url = old_url.replace(/\{latdegdec\}/g, lat).replace(/\{londegdec\}/g, lon).replace(/\{scale\}/g, scale).replace(/\{span\}/g, scale/1e6).replace(/\{osmzoom\}/g, osmzoom).replace(/\{zoom\}/g, zoom);
			$(this).attr("href", replacement_url);
		});

		$("#siteSub").append("<hr><img src='https://upload.wikimedia.org/wikipedia/commons/thumb/4/41/Symbol_confirmed.svg/16px-Symbol_confirmed.svg.png'/> Coordinates loaded<hr>");

	} else {

		$("#siteSub").append("<hr><img src='https://upload.wikimedia.org/wikipedia/commons/thumb/1/1d/Information_icon4.svg/20px-Information_icon4.svg.png'/> <span style='font-weight:bold;'>Note:</span> No coordinates loaded (mapping service links will not work)<hr>");

	}

});