// Greasemonkey http://greasemonkey.mozdev.org/
//
// ==UserScript==
// @name         GoogleMapMax 1.0.31
// @description  Maximizes height and width of the map.
// @namespace    http://deoxy.org/gm
// @include      http://maps.google.com*
// ==/UserScript==
/*
Issues:

1. The window must be resized after loading to get 100% map height.
2. Search results and error messages popup a new window, but the links don't work.
3. Javascript errors somehow related to the previous issue...

Changes:

1.0   - Initial release.
1.0.1 - Changed prefs, other improvements.
1.0.2 - Added fullscreen link, blue background. Remembers location when changing modes.
1.0.3 - Added current lat/lon display and internal bookmarks from the gmap_extras script.
        http://www.gnik.com/gmaps/gmap_extras.user.js
1.0.31- Fixed most breakage caused by changes at google, still not 100% wide.

*/

window.addEventListener('load',function() {
  var version = '1.0.31';
  var state = GM_getValue('toggle','on');
  var obj, pagediv, pagelink, helpdiv, paneldiv, mapdiv, imapdiv;

  obj = document.evaluate("//div[contains(@id,'page')]",
        document,null, XPathResult.FIRST_ORDERED_NODE_TYPE,null);
  pagediv  = obj.singleNodeValue;
  pagediv.setAttribute('style', '');
  pagediv.setAttribute('style', 'text-align:left;position:absolute;left:0px;top:0px;');
  
  obj = document.evaluate("//a[contains(@id,'linktopage')]",
        document,null, XPathResult.FIRST_ORDERED_NODE_TYPE,null);
  pagelink = obj.singleNodeValue;
  
  obj = document.evaluate("//div[contains(@class,'noprint')]",
        document,null, XPathResult.FIRST_ORDERED_NODE_TYPE,null);
  helpdiv  = obj.singleNodeValue;
  helpdiv.setAttribute('style', 'display:none');
  
  obj = document.evaluate("//div[contains(@id,'panel')]",
        document,null, XPathResult.FIRST_ORDERED_NODE_TYPE,null);
  paneldiv = obj.singleNodeValue;
  paneldiv.setAttribute('style', 'display:none');
  
  obj = document.evaluate("//div[contains(@id,'map')]",
        document,null, XPathResult.FIRST_ORDERED_NODE_TYPE,null);
  mapdiv = obj.singleNodeValue;
  
  pagediv.innerHTML.replace(/-96px/g,'0px');

  function stop(e) {
    e.stopPropagation();
    e.preventDefault();
  }

  document.addEventListener('click', function(event) {
    var o = document.evaluate("//a[contains(@id,'linktopage')]",
            document,null, XPathResult.FIRST_ORDERED_NODE_TYPE,null);
    var p = o.singleNodeValue;
    var plu = p.getAttribute('href');
    
    if (event.target == 'javascript:fullscreen()') {
      stop(event);
      
      var mw = window.open('http://maps.google.com'+plu,'fullscreen','fullscreen,scrollbars');
      var tw = window.open('','tempwin','resizable,width=400,height=300');
      tw.document.write('<html><head><title>Fullscreen</title></head><body bgcolor="#668096" text="#ffffff">'+
      '<p align=center><br><h1>Press F11 for fullscreen in new map window</h1>'+
      'One moment...</body></html>');
      tw.document.close();
      tw.focus();
      setTimeout(function() {
        tw.close();
        mw.focus();
      },2000);
    }
    if (event.target == 'javascript:search()') {
      stop(event);
      var query = prompt('Search for','');
      if (query)
        location.href = 'http://maps.google.com/maps?q=' + escape(query);
    }
    else if (event.target == 'javascript:help()') {
      stop(event);
      var hmm = confirm(
      'Resize window to get full map height.\n\n\n'+
      'This is version '+version+'.\n'+
      'Want to check for an updated script?\n'
      );
      if (hmm) window.open('http://deoxy.org/gm','updates,', 
      'menubar,toolbar,location,scrollbars,status,resizable');
    }
    else if (event.target == 'javascript:toggle()') {
      stop(event);
      if (state == 'off') 
        GM_setValue('toggle', 'on');
      else
        GM_setValue('toggle', 'off');
      location.href = 'http://maps.google.com'+plu;
    }
  }, true);

  if (state == 'off') {
    var a = document.createElement('a');
    a.setAttribute('href', 'javascript:toggle()');
    a.appendChild(document.createTextNode('Enable'));
    pagediv.appendChild(a);
    a = document.createElement('small');
    a.appendChild(document.createTextNode(' - GoogleMapMax v'+version));
    pagediv.appendChild(a);
    return;
  }

  function addGlobal(tag, type, data) {
    var head = document.getElementsByTagName('head')[0];
    var text = document.createElement(tag);
    text.type = type;
    text.innerHTML = data;
    head.appendChild(text);
  }

  addGlobal('style','text/css',
  '.noprint      {opacity:0.7}'+
  '#headertitle  {display:none}'+
  '#header       {display:none}'+
  '#panel {display:none}'+
  '#rhs   {display:none}'+
  '#sethomelink   {display:none}'+
//  '#page  {width:100%; height:100%;text-align:left;position:absolute;left:0px;top:0px;}'+
//  '#map   {width:100%; height:100%}'+
  'body   {background-color:#668096; color:#cccccc;}'+
  'A:link    {text-decoration:none; color:#ffffff;}'+
  'A:visited {text-decoration:none; color:#ffffff;}'+
  'A:active  {text-decoration:none; color:#ffffff;}'+
  'A:hover   {text-decoration:underline overline; color: #bbd5ec;}'+
  '.button {background-color:#88a2b8; color:#ffffff; border:1px solid #bbd5ec;}'+
  '.select {background-color:#88a2b8; color:#ffffff; border:1px solid #bbd5ec;}'
  );

  var metapanel = document.getElementById('printpanel');
  if (metapanel) {
    var mpi = metapanel.innerHTML;
    if (mpi) {
      var mw = window.open('','metawin','scrollbars,status,resizable,width=400,height=400');
      mw.document.write('<html><head><title>Metapanel<\/title><\/head><body>'+mpi+'<\/body><\/html>');
      mw.document.close();
      mw.focus();
    }
  metapanel.style.display = 'none';
  }

  var panel = document.getElementById('panel');
  if (panel) {
    var pi = panel.innerHTML;
    if (pi) {
      var pw = window.open('','panelwin','scrollbars,status,resizable,width=400,height=400');
      pw.document.write('<html><head><title>Panel<\/title><\/head><body>'+pi+'<\/body><\/html>');
      pw.document.close();
      pw.focus();
    }
  panel.style.display = 'none';
  }

  function getlatlon() {
  // from http://www.gnik.com/gmaps/gmap_extras.user.js
    var center = _m.map.getCenterLatLng();
    var x  = Math.round(center.x * 1000000) / 1000000.0;
    var y  = Math.round(center.y * 1000000) / 1000000.0;
    var ll = document.getElementById('latlon');
    ll.innerHTML = y + ' ' + x;
  }

  // LINK
  pagediv.setAttribute('style','font-size:0.8em');
  pagediv.appendChild(pagelink);
  pagediv.appendChild(document.createTextNode(' - '));

  // SEARCH
  pagelink = document.createElement('a');
  pagelink.setAttribute('id', 'searchlink');
  pagelink.setAttribute('href', 'javascript:search()');
  pagelink.appendChild(document.createTextNode('Search'));
    
  pagediv.appendChild(pagelink);
  pagediv.appendChild(document.createTextNode(' - '));
    
  // FULLSCREEN
  pagelink = document.createElement('a');
  pagelink.setAttribute('href', 'javascript:fullscreen()');
  pagelink.appendChild(document.createTextNode('Fullscreen'));
    
  pagediv.appendChild(pagelink);
  pagediv.appendChild(document.createTextNode(' - '));

  // DISABLE  
  pagelink = document.createElement('a');
  pagelink.setAttribute('href', 'javascript:toggle()');
  pagelink.appendChild(document.createTextNode('Disable'));
    
  pagediv.appendChild(pagelink);
  pagediv.appendChild(document.createTextNode(' - '));  

  // CLOSE
  if (self.name == 'fullscreen') {
    pagelink = document.createElement('a');
    pagelink.setAttribute('href', 'javascript:self.close()');
    pagelink.appendChild(document.createTextNode('Close'));
    
    pagediv.appendChild(pagelink);
    pagediv.appendChild(document.createTextNode(' - '));  
  }
  
  // HELP  
  pagelink = document.createElement('a');
  pagelink.setAttribute('href', 'javascript:help()');
  pagelink.appendChild(document.createTextNode('Help'));
    
  pagediv.appendChild(pagelink);
  pagediv.appendChild(document.createTextNode(' - Lat/Lon: '));
  
  pagelink = document.createElement('span');
  pagelink.setAttribute('id', 'latlon');
  
  pagediv.appendChild(pagelink);
  getlatlon();
  
  pagelink = document.createElement('span');
  pagelink.setAttribute('id', 'bookmark');
  pagediv.appendChild(pagelink);
  
  // Bookmark functions from http://www.gnik.com/gmaps/gmap_extras.user.js  
  window._gmap_extras = new Object();
  window._gmap_extras.bookmarkDelete = function() {
    var form = document.getElementById("latlonform");
    if (!form || !GM_setValue) { return; }
    var sel = form.bookmarks;
    if (sel.selectedIndex == 0) return;
    var bId = sel.selectedIndex-1;
    var bCount = GM_getValue("b.count", 0);
    for (var i = bId; i < bCount-1; i++) {
      var nexti = i+1;
      var nextloc = GM_getValue("b."+nexti);
      GM_setValue("b."+i, nextloc);
    }
    GM_setValue("b."+(bCount-1), ""); 
    GM_setValue("b.count", bCount-1);
    sel.options[sel.selectedIndex] = null;
  }

  window._gmap_extras.bookmarkGoto = function() {
    var form = document.getElementById("latlonform");
    if (!form || !GM_setValue) { return; }
    var sel = form.bookmarks;
    if (sel.selectedIndex == 0) return;
    var location = sel.options[sel.selectedIndex].value;  
    var name = sel.options[sel.selectedIndex].text;  
    document.location.href = location;
  }

  window._gmap_extras.bookmarkAdd = function() {
    var form = document.getElementById("latlonform");
    if (!form || !GM_setValue) { return; }
    var location = _m.permalink.href;
    var name = prompt("Save this location as", _m.vpage.title);
    if (name == "") { alert("You must supply a name"); return; }
    var bCount = GM_getValue("b.count", 0);
    GM_setValue("b."+bCount, name + "|" + location);
    bCount += 1;
    GM_setValue("b.count", bCount);
    var option = new Option(name, location);
    var sel = form.bookmarks;
    sel.options[sel.options.length] = new Option(name, location);
    sel.selectedIndex = sel.options.length-1;
    }
  
  var html = '<form id="latlonform">'+
  '<input type="button" value="Save" onClick="_gmap_extras.bookmarkAdd()" class=button>'+
  '<select name="bookmarks" class=select><option value="">Bookmarks</option>';
  var bCount = GM_getValue('b.count', 0);
  for (var j = 0; j < bCount; j++) {
    var value = GM_getValue('b.' + j);
    var values = value.split('|');
    html += '<option value="'
    + values[1]
    + '">' 
    + values[0]
    + '</option>';
  }
  html += '</select>'+
  '<input type=button value="Goto" onClick="_gmap_extras.bookmarkGoto()" class=button>'+
  '<input type=button value="Delete" onClick="_gmap_extras.bookmarkDelete()" class=button></form>';
  var bm = document.getElementById('bookmark');
  bm.innerHTML = html;
    
  // Add a listener to update the lat/lon when the map is moved
  _Event.addListener(_m.map, 'moveend', getlatlon);

}, true);


