// ==UserScript==
// @name	Google Maps Show Coords Link
// @namespace	http://inge.org.uk/userscripts
// @description	Creates a link on Google Maps to show the map centre lat/lon coordinates.
// @include	http://maps.google.tld/*
// @include	http://www.google.tld/local*
// @include	http://www.google.tld/maps*
// @license	MIT License; http://www.opensource.org/licenses/mit-license.php
// @copyright	2011, James Inge (http://geo.inge.org.uk/)
// @version 0.9.1
// ==/UserScript==

//  v0.91 - Fixed for new Google layout. Format change now using script variable.
//  v0.9  - Added copy to clipboard function.
//  v0.81 - Bugfixes
//  v0.8	- Ability to display in DD.ddd and DD MM.mmm formats.
//  v0.7	- Now works with any top-level domain version of Google Maps
//  v0.2 to 0.6	- Updates to match various minor changes in Google Maps' page structure; No changes in functionality.

// Set the variable below to true for DD.ddd or false for DD MM.mmm
var decDegrees = false;

function addGeoLink() {
	var targets = document.evaluate("//div[@id='search']/div/div[@class='header-buttons kd-buttonbar']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
	var showScript = ['function dmm(deg) {var s=(deg<0)?"-":"";var d = Math.abs(deg);var m = ((d - Math.floor(d))*60).toFixed(3);d = Math.floor(d);return s+d+ " " + m;}\
		var lat = gApplication.getMap().getCenter().lat();\
		var lon = gApplication.getMap().getCenter().lng();',
		decDegrees ? 'document.getElementById("coordtxt").innerHTML=lat.toFixed(6) + "<br/>" + lon.toFixed(6);' : 'document.getElementById("coordtxt").innerHTML=dmm(+lat) + "<br/>" + dmm(+lon);',
		'return false;'
	].join('');

	if (targets.snapshotLength == 1) {
		var targetDiv = targets.snapshotItem(0);
		targetDiv.style.width = (targetDiv.offsetWidth + 60) + "px";
		targetDiv.innerHTML += "<a title='Click to show coordinates at map centre.' class='kd-button print-button mid small' id='coordtxt' onclick='"+ showScript +"'>Show coords</a>";
		var myButton = document.getElementById("coordtxt");
		myButton.style.lineHeight = "inherit";
		myButton.style.width = "60px";
	}
}

function cmE(event){
  if( !event ) var event = window.event;
  if( event.target.id == "coordtxt") {
    var text = event.target.innerHTML;
    if( text == "Show coords" ) return; // Not got coords yet.
    text = text.replace(/<br\/?>/,",");
    if( window.clipboardData ) {
      // IE - not tested
      window.clipboardData.setData('Text', text);
    } else {
      if(unsafeWindow.netscape && unsafeWindow.netscape.security) {
        // Firefox etc.
        try {
          unsafeWindow.netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
          var comp_classes = Components.classes;
        } catch(e) { 
          // When "signed.applets.codebase_principal_support" is set to false
          GM_log("Can't copy to clipboard due to security settings. Set 'signed.applets.codebase_principal_support' to 'true' in about:config");
          return;
        } 
        var comp_interf = Components.interfaces;
        var clipboard_inst		= comp_classes["@mozilla.org/widget/clipboard;1"].createInstance(comp_interf.nsIClipboard);
        var transferable_inst	= comp_classes["@mozilla.org/widget/transferable;1"].createInstance(comp_interf.nsITransferable);
        var supportsstring_inst	= comp_classes["@mozilla.org/supports-string;1"].createInstance(comp_interf.nsISupportsString);
        if(!clipboard_inst || !transferable_inst || !supportsstring_inst) { GM_log("Can't copy to clipboard. Some problem with Mozilla widgets...");return; }

        transferable_inst.addDataFlavor("text/unicode");
        supportsstring_inst.data = text;
        transferable_inst.setTransferData("text/unicode", supportsstring_inst, text.length*2);
        clipboard_inst.setData(transferable_inst, null, comp_interf.nsIClipboard.kGlobalClipboard);
      } else {
        // Browsers that don't use the Gecko engine
        GM_log("I don't know how to access the clipboard in this browser");
        return;
      }
    }
    event.cancelBubble = true;
    if(event.preventDefault) event.preventDefault();
    if(event.stopPropagation) event.stopPropagation();
    return false;
  }
}

document.addEventListener('contextmenu', cmE, false);

addGeoLink();
