Source for "Eniro Kartor <-> Google Maps links"

By Johan Sundström
Has 118 other scripts.


// ==UserScript==
// @name           Eniro Kartor <-> Google Maps links
// @namespace      http://code.google.com/p/ecmanaut/
// @description    Adds links between Eniro and Google Maps in the page header.
// @include        http://kartor.eniro.se/*
// @include        http://maps.google.com/*
// @include        http://local.google.com/*
// ==/UserScript==

if (location.pathname.match( /\//g ).length > 1) return; // only root directory

if (location.hostname.match( /\.google\./ ))
  initGoogle( document.getElementById( "link" ) );
else
  initEniro( $X("//li/a[.='Länk till kartan']") );

function initGoogle( link ) {
  function mapMoved( event ) {
    if (event.attrName != "href") return; // false alarm
    urlFromGURL( event.newValue, dest );
  }

  var dest = link.cloneNode( true );
  dest.removeAttribute( "id" );
  dest.removeAttribute( "onclick" );
  dest.lastChild.innerHTML = "Eniro";
  dest.style.display = "none";
  link.parentNode.appendChild( dest );

  link.addEventListener( "DOMAttrModified", mapMoved, false );
}

function initEniro( link ) {
  function updateGoogle( event ) {
    urlFromEURL( link.href, dest );
  }

  var ul = link.parentNode.parentNode;
  var li = link.parentNode.cloneNode( true );
  var dest = li.firstChild;
  dest.removeAttribute( "id" );
  dest.removeAttribute( "onclick" );
  dest.innerHTML = "Google Maps";
  dest.title = "Länk till Google Maps";
  ul.insertBefore( li, ul.firstChild );

  dest.addEventListener( "mouseover", updateGoogle, false );
}

function urlFromEURL( url, link ) {
  var dst = "http://maps.google.com/maps?";
  //var form = document.getElementById( "mapForm" ).elements;
  //var mode = parseInt( form.namedItem( "imgmode" ).value, 10 );
  //var mapstate = form.namedItem( "mapstate" ).value.split(";");
  var map = window.eniMap||unsafeWindow.eniMap; // API probably more stable
  var t = { standard:"", aerial:"k", hybrid:"h" }[ map.getTileType() ] || "";
  //var t = ["", "k", "h"][mode];
  if (t) dst += "t="+ t +"&";
  //var z = [0, 4, 7, 10, 11, 13, 14, 16, 17][parseInt( mapstate[0], 10 )];
  //var lng = mapstate[1], lat = mapstate[2];
  var pos = map.getCenter(), lat = pos.y, lng = pos.x;
  var z = [0, 4, 7, 10, 11, 13, 14, 16, 17][map.getZoomLevel()];
  link.href = dst + "ll="+ lat +","+ lng +"&z="+ z +"&om=1";
}

function urlFromGURL( url, link ) {
  var dst = "http://kartor.eniro.se/query?what=map_wp&imgmode=";
  var got = url.match( /&ll=([\d.]+),([\d.]+).*/ );
  if (got) {
    var lat = got[1], lng = got[2];
    if ((lat < 55.315) || (lat > 69.071) ||
        (lng < 10.945) || (lng > 19.451) ) {
      //console.log( "%s, %s outside of Sweden", lat, lng );
      return link.style.display = "none";
    }
    link.style.display = "inline";

    if (got = url.match( /[?&]t=(.)/ ))
      dst += ({ k:1, h:2 }[got[1]]);
    else
      dst += 0;

    var z = 1;
    if (got = url.match( /&z=(\d+)/ )) {
      z = parseInt( got[1], 10 );
      if (z <= 4)  z = 1; else
      if (z <= 7)  z = 2; else
      if (z <= 10) z = 3; else
      if (z <= 11) z = 4; else
      if (z <= 13) z = 5; else
      if (z <= 14) z = 6; else
      if (z <= 16) z = 7; else z = 8;
    }
    link.href = dst + "&mapstate="+ z +";" + lng +";"+ lat;
  }
}

function $X( xpath, root ) {
  var doc = root ? root.evaluate ? root : root.ownerDocument : document;
  var got = doc.evaluate( xpath, root||doc, null, 0, null );
  switch( got.resultType ) {
    case got.STRING_TYPE:
      return got.stringValue;
    case got.NUMBER_TYPE:
      return got.numberValue;
    case got.BOOLEAN_TYPE:
      return got.booleanValue;
    default:
      return got.iterateNext();
  }
}