////////////////////////////////////////////////////////////////////////////////
// Variables 
////////////////////////////////////////////////////////////////////////////////
// Global Variables :
var map;
var mapDiv;
var currentLayers;
var mapOverlayEnabled;
var mapBackgroundMonth;
var geocoder;

//var baseTileURL = '/images/gis/bm_tiles/bm_tiles.';
var baseTileURL = 'http://data.theweatherarchive.com/images/gis/bm_tiles/bm_tiles.';
var blankTile = '/images/gis/bm_tiles/blank_tile.gif';
var currentEmailLinkSubject = 'The%20World%20Through%20the%20Seasons';
var baseURL = 'http://www.theweatherarchive.com/maps/world_seasons.html'
 
////////////////////////////////////////////////////////////////////////////////
// Main setup/size methods 
////////////////////////////////////////////////////////////////////////////////
function onLoad() {
  geocoder = new GClientGeocoder();
  mapDiv = document.getElementById("mapDiv");
  map = new GMap2(mapDiv);
  map.addControl(new GLargeMapControl());
  //map.addControl(new GMapTypeControl());
  //map.addControl(new GOverviewMapControl());
  map.setCenter(defaultCenter, defaultZoomLevel);  
  map.setMapType(G_SATELLITE_MAP);   
  setupMapOverlayTypes();

  GEvent.addDomListener(mapDiv, "DOMMouseScroll", map.wheelZoom);
  GEvent.addDomListener(mapDiv, "mousewheel", map.wheelZoom);
  GEvent.addListener(map, 'moveend', updateCurrentLinks);
  GEvent.addListener(map, 'zoomend', updateCurrentLinks);

  setURLViewport(); //  Set the viewport based on the url
  setURLLayers(); // Set the layers based on the url
  //showAddress('Ireland');
  updateCurrentLinks();
  updateSelectors();

}

function updateCurrent() {
  // Update information about the current lat, lon and zoom
  var status = document.getElementById('currentStatus');
  if (!status) 
     return;

  var zoom = map.getZoom();
  var center = map.getCenter();
  var lat = Math.round(center.y*10000)/10000;
  var lon = Math.round(center.x*1000)/10000;
  status.innerHTML = lon + ", " + lat;
}

function setupMapOverlayTypes() {
  // Setup the custom map overlay types :
  mapOverlayEnabled = defaultMapOverlayEnabled;
  mapBackgroundMonth = defaultBMMonth;

  updateMapType(mapBackgroundMonth, mapOverlayEnabled);  
}

function LZ(x) {
    return (x >= 10 || x < 0 ? "" : "0") + x;
}

function updateMapType(month, overlayEnabled) {
  if (month == 0) {
    if (overlayEnabled)
      map.setMapType(G_HYBRID_MAP); // Standard Sat+Map
    else
      map.setMapType(G_SATELLITE_MAP); // Standard Sat
  } else {
    // Specific Blue Marble Month
    customMapType = setupMapType('Custom', function(x,y,zoom) {return getBlueMarbleOverlayURL(month,x,y,zoom);},0,8,'Copyright NASA', overlayEnabled);
    map.setMapType(customMapType);
  }
}

function getBlueMarbleOverlayURL(month, pt, zoom) {
  month = LZ(month)
  var x = pt.x;
  var y = pt.y;
  zoom = 17-zoom;

  var tilesAtThisZoom = Math.pow(2,17-zoom);
  while (x < 0) {
    x += tilesAtThisZoom;
  }
  while (x >= tilesAtThisZoom) {
    x -= tilesAtThisZoom;
  }

  if (y < 0) {
    return blankTile;
  } else if (y >= tilesAtThisZoom) {
    return blankTile;
  }

  if (zoom < 9) {
    return blankTile;
  }

  var url = baseTileURL + month + '/' + zoom + '/' + x + '/tile.' + zoom + '.' + x + '.' + y + '.jpg';

  //messages.innerHTML += url + '<br>\n';
  return url;
}

function backgroundLayerChange(id) {
  var ob = document.getElementById(id);
  var s = ob.options[ob.selectedIndex].text;
  mapBackgroundMonth = parseInt(ob.options[ob.selectedIndex].value);

  updateMapType(mapBackgroundMonth, mapOverlayEnabled);
}

function foregroundLayerChange(id) {
  var ob = document.getElementById(id);
  mapOverlayEnabled = ob.checked;

  updateMapType(mapBackgroundMonth, mapOverlayEnabled);  
}

function updateSelectors() {
  // Ensure the checkbox is set right :
  var id = 'foregroundLayerSelector_map';
  var ob = document.getElementById(id);
  ob.checked = mapOverlayEnabled;

  id = 'backgroundLayerSelector';
  ob = document.getElementById(id);
  for (var i=0;i <ob.options.length;i++) {
    if (ob.options[i].value == '' + mapBackgroundMonth) {
      ob.selectedIndex = i;
      break;
    }
  }
}

function selectPreviousMonth() {
  mapBackgroundMonth -=1;
  if (mapBackgroundMonth < 1) mapBackgroundMonth = 12;
  updateSelectors();
  updateMapType(mapBackgroundMonth, mapOverlayEnabled);
}

function selectNextMonth() {
  mapBackgroundMonth +=1;
  if (mapBackgroundMonth > 12) mapBackgroundMonth = 1;
  updateSelectors();
  updateMapType(mapBackgroundMonth, mapOverlayEnabled);
}

function showAddress(address) {
  geocoder.getLatLng(
    address,
    function(point) {
      if (point) {
        map.setCenter(point, defaultZoomLevel);
        //var marker = new GMarker(point);
        //map.addOverlay(marker);
        //marker.openInfoWindowHtml(address);
      }
    }
  );
}

function getCustomLinkParams(isEmailLink) {
    var sep = '&';
    if (isEmailLink) sep = '%26';
    return 'month=' + mapBackgroundMonth + sep + 'showMap=' + mapOverlayEnabled;
}

function updateCurrentLinks() {
    var currentWebLink = document.getElementById('currentWebLink');
    var currentEmailLink = document.getElementById('currentEmailLink');

    if (currentWebLink)
        currentWebLink.href = baseURL + '?' + getCurrentCurrentLinkParams(false) + '&' + getCustomLinkParams(false);

    if (currentEmailLink)
        currentEmailLink.href = "mailto:?subject=" + currentEmailLinkSubject +"&body=" + baseURL + '%3F' + getCurrentCurrentLinkParams(true) + '%26' + getCustomLinkParams(true);
}


function setURLLayers() {
    // Set the month, and map overlay from the current url where possible.
    var changed=false;
    var q = getQueryString();
	
    var month = q['month'];
    if (typeof month != 'undefined') {
        mapBackgroundMonth = parseInt(month);
	changed = true;
    }

    var showMap = q['showMap'];
    if (typeof showMap != 'undefined') {
        if ((showMap == 'true') && (!mapOverlayEnabled))  {
	    mapOverlayEnabled=true;
	    changed=true;
	} else if ((showMap == 'false') && (mapOverlayEnabled))  {
            mapOverlayEnabled=false;
            changed=true;
	}
    }
    if (changed)
        updateMapType(mapBackgroundMonth, mapOverlayEnabled);
}
