var megalabMap;
var spotMarker;    // store marker
var currentMarker; // variable used in ajax.
var loadedMarkers = new Array(); // array of current marker objects
var loadedMarkersList = ''; // variable to avoid work when loading markers from ajax
var currentLevel = null; // different to zoom, this gives the current cluster level either 0 1 2 or 3
var markerToPopup = null; // lat and lng holder for marker to show info.
var loading = false; // check for ajax!
var lmTimeout = null; // timeout holder
var lamTimeout = null; // timeout holder

function gmapSetup() {
  if (GBrowserIsCompatible()) {
    // create map
    megalabMap = new GMap2($('map'));
    mapInit();
    //createLoader();
    //hideLoader();
  }
  self.focus();
}

function mapInit(){}

function toggleEvent() {
  if(this.clicked) {
    this.clicked = false;
    var icon = this.getIcon();
    var path = icon.image;
    path = path.split('.');
    var image = path[(path.length - 2)];
    path[(path.length - 2)] = image.replace(/_selected/, '');
    path = path.join('.');
    this.setImage(path);
    removeEvent(this.pinId);
  } else {
    this.clicked = true;
    var icon = this.getIcon();
    var path = icon.image;
    path = path.split('.');
    path[(path.length - 2)] = path[(path.length - 2)] + '_selected';
    path = path.join('.');
    this.setImage(path);
    addEvent(this.pinId);
  }
  checkDownload();
}

function addEvent(id) {
  var form = $('download_form');
  var input = document.createElement('input');
  input.setAttribute('type', 'hidden');
  input.setAttribute('id', 'event_'+id);
  input.setAttribute('name', 'event_'+id);
  input.setAttribute('value', id);
  form.appendChild(input);
}

function removeEvent(id) {
  var form = $('download_form');
  var input = $('event_'+id);
  if(input) {
    form.removeChild(input);
  }
}

function removeAllEvents() {
  var form = $('download_form');
  var input =  $$('input[id^=event_]');
  for(var i = 0; i < input.length; i++) {
    form.removeChild(input[i]);
  }
  checkDownload();
}

function addCluster() {
  var form = $('download_form');
  var input = document.createElement('input');
  input.setAttribute('type', 'hidden');
  input.setAttribute('id', 'cluster_level');
  input.setAttribute('name', 'cluster_level');
  input.setAttribute('value', 'cluster_level');
  form.appendChild(input);
}

function removeCluster() {
  var form = $('download_form');
  var input = $('cluster_level');
  if(input) {
    form.removeChild(input);
  }
}

function checkDownload() {
  var events = $$('input[id^=event_]');
  var button = $('download_submit');
  if(events.length > 0) {
    button.removeAttribute('disabled');
  } else {
    button.setAttribute('disabled', 'disabled');
  }
}

function endDragMarker() {
  addCoords(this);
}

function updateZoom(oldLevel, newLevel) {
  var zoom = $('zoom_level');
  zoom.value = newLevel;
}

function loadMarkers(oldLevel, newLevel) {
  if(lmTimeout) {
    window.clearTimeout(lmTimeout);
  }
  var level = getLevel();
  if(currentLevel == null) {
    currentLevel = level;
  } else if (currentLevel != level) {
    currentLevel = level;
    megalabMap.clearOverlays();
    loadedMarkers = new Array();
    loadedMarkersList = '';
    removeAllEvents();
  }
  if(currentLevel != getUnclusteredLevel() && !$('cluster_level')) {
    addCluster();
  } else {
    removeCluster();
  }
  var sw = megalabMap.getBounds().getSouthWest();
  var ne = megalabMap.getBounds().getNorthEast();
  lmTimeout = window.setTimeout(function(){loading = true;GDownloadUrl(getBaseURL(false) + '/maps/retrievePinInfo?level='+level+'&south='+sw.lat()+'&west='+sw.lng()+'&north='+ne.lat()+'&east='+ne.lng()+'&excluded='+loadedMarkersList, populateMap);}, 1000);
}

function loadAdditionalMarkers() {
  if(lamTimeout) {
    window.clearTimeout(lamTimeout);
  }
  if(!loading) {
    var level = getLevel();
    var sw = megalabMap.getBounds().getSouthWest();
    var ne = megalabMap.getBounds().getNorthEast();
    lamTimeout = window.setTimeout(function(){loading = true;GDownloadUrl(getBaseURL(false) + '/maps/retrievePinInfo?level='+level+'&south='+sw.lat()+'&west='+sw.lng()+'&north='+ne.lat()+'&east='+ne.lng()+'&excluded='+loadedMarkersList, populateMap);}, 1000);
  }
}

function populateMap(data, responseCode) {
  var json = data.evalJSON();
  for(var i = 0; i < json.pins.length; i++)
  {
    if(json.level != getLevel()) break;
    createMarker(json.pins[i]);
  }
  loading = false;
  if(markerToPopup) {
    var id = markerToPopup;
    markerToPopup = null;
    openPopup(id);
  }
}

function createMarker(obj) {
  var opts = new Object();
  opts.title = obj.title;
  iconPath = obj.iconPath;
  var icon = new GIcon(G_DEFAULT_ICON, iconPath);
  icon.iconSize = new GSize(obj.iconWidth, obj.iconHeight);
  if(currentLevel != getUnclusteredLevel()) {
    //opts.clickable = false;
    icon.shadow = null;
    icon.iconAnchor = new GPoint(18, 18);
    icon.imageMap = new Array(13,1,23,1,27,3,33,8,35,13,35,23,33,28,28,33,23,35,13,35,8,33,3,28,1,23,1,13,3,8,7,4,10,2);
  }
  //showImageMap(icon);
  opts.icon = icon;
  var mkr = new GMarker(new GLatLng(obj.lat, obj.lng), opts);
  //if(currentLevel == getUnclusteredLevel()) {
    //GEvent.addListener(mkr, 'click', showLocationInfo);
  GEvent.addListener(mkr, 'click', toggleEvent);
  //} else {
    //GEvent.addListener(mkr, 'click', showClusterInfo);
  //}
  mkr.pinId = obj.id;
  megalabMap.addOverlay(mkr);
  loadedMarkers.push(mkr);
  var comma = '';
  if(loadedMarkersList != '') {
    comma = ',';
  }
  loadedMarkersList += comma + obj.id;
}

function getLevel() {
  switch(megalabMap.getZoom()) {
    case 0: case 1: case 2:
      return 0;
    case 3: case 4: case 5:
      return 1;
    case 6: case 7:
      return 2;
    case 8: case 9:
      return 3;
    case 10: case 11:
      return 4;
    default:
      return 5;
  }
}

function getUnclusteredLevel() {
  return 5;
}

function drawGrid(level) {
  var grids = new Array(14.4, 3.6, 0.72, 0.144, 0.072);
  var grid = grids[level];
  for(var lat = 43.2; lat <= 72; lat += grid) {
    var points = new Array(new GLatLng(lat, -90), new GLatLng(lat, 90));
    megalabMap.addOverlay(new GPolyline(points, '#c90000', 1, 1));
  }
  for(var lng = -28.8; lng <= 14.4; lng += grid) {
    var points = new Array(new GLatLng(-90, lng), new GLatLng(90, lng));
    megalabMap.addOverlay(new GPolyline(points, '#c90000', 1, 1));
  }
}

function showClusterInfo() {
  var zoom = megalabMap.getZoom();
  currentMarker = this;
  GDownloadUrl(getBaseURL(true) + '/showClusterInfo/clusterId/'+this.pinId, addInfoWindow);
}
