var Mapper = new Object();
Mapper.counts = new Object();
Mapper.locations = new Array();
Mapper.start_lat = 54.977;
Mapper.start_lng = -3.51;
Mapper.zoomLevel = 5;
Mapper.onLoadSearch = "";

Mapper.load = function(node_id, hideZoom) {
  node_id = node_id || "map";
  hideZoom = hideZoom || false;
  if (GBrowserIsCompatible()) {
    Mapper.map = new GMap2(document.getElementById(node_id));
    Mapper.map.setCenter(new GLatLng(Mapper.start_lat, Mapper.start_lng), Mapper.zoomLevel);
    if (!hideZoom) {
      Mapper.map.addControl(new GLargeMapControl());
    }
  }
  if (Mapper.onLoadSearch.length) {
    Mapper.search(Mapper.onLoadSearch);
  }
}

Mapper.unload = function() {
  GUnload();
}

Mapper.setCenter = function(lat, lng, zoomLevel) {
  Mapper.start_lat = lat;
  Mapper.start_lng = lng;
  Mapper.zoomLevel = zoomLevel;
}

Mapper.setLoadSearch = function(form) {
  Mapper.onLoadSearch = form;
}

Mapper.addLocation = function(location) {
  Mapper.locations[Mapper.locations.length] = location;
}

Mapper.search = function (form) {
  new Ajax.Request('/ajax/searchCount/', {method:'post', postBody:form, onSuccess:Mapper.update});
  Mapper.showLoading();
}

Mapper.update = function(t) {
  var response = t.responseText;
  var lines = response.split("\n");
  Mapper.counts = new Object();
  Mapper.map.clearOverlays();
  for (var i = 0; i < lines.length; i++) {
    if (lines[i].length > 0) {
      parts = lines[i].split(",");
      Mapper.counts[parts[0]] = parts[1];
    }
  }
  Mapper.setPoints();
  Mapper.hideLoading();
}

Mapper.getLocation = function(location_id) {
  for (var i = 0; i < Mapper.locations.length; i++) {
    if (Mapper.locations[i].id == location_id) {
      return Mapper.locations[i];
    }
  }
  return false;
}

Mapper.setPoints = function() {
  for (var key in Mapper.counts) {
    loc = Mapper.getLocation(key);
    Mapper.map.addOverlay(Mapper.createMarker(loc));
  }
}

Mapper.createMarker = function(loc) {
  // Set up our GMarkerOptions object
  var marker = new GMarker(new GLatLng(loc.lat, loc.lng));
  marker.id = loc.id;
  marker.name = loc.name.replace('&#039;','\'').replace('&amp;','&');
  marker.count = Mapper.counts[loc.id];

  marker.tooltip = new Tooltip(marker, marker.name + ' - ' + marker.count + ' jobs',4);
  Mapper.map.addOverlay(marker.tooltip);

  GEvent.addListener(marker, "click", function() {
    location.href='/search/location/' + this.id + '/';
  });
  GEvent.addListener(marker, "mouseover", function() {
    this.tooltip.show();
  });
  GEvent.addListener(marker, "mouseout", function() {
    this.tooltip.hide();
  });
  return marker;
}

Mapper.createCustomMarker = function(lat, lng, heading, content, iconurl) {
  iconurl = iconurl || false;

  if (iconurl) {
    var newIcon = new GIcon(G_DEFAULT_ICON);
    newIcon.image = iconurl;
    markerOptions = { icon: newIcon };
  } else {
    markerOptions = {};
  }
  // Set up our GMarkerOptions object
  var marker = new GMarker(new GLatLng(lat, lng), markerOptions);
  content = content || false;

  html = '<h3>' + heading + '</h3>';
  if (content) {
    html += '<p>' + content + '</p>';
  }
  marker.html = html;

  GEvent.addListener(marker, "click", function() {
    marker.openInfoWindowHtml(marker.html);
  });
  return marker;
}

Mapper.showLoading = function() {
  var els = document.getElementsByClassName('ajax_inactive');
  for (var i = 0; i < els.length; i++) {
    els[i].className = 'ajax_active';
  }
}

Mapper.hideLoading = function() {
  var els = document.getElementsByClassName('ajax_active');
  for (var i = 0; i < els.length; i++) {
    els[i].className = 'ajax_inactive';
  }
}



//Tooltip functions
/**
 * @author Marco Alionso Ramirez, marco@onemarco.com
 */
function Tooltip(marker, text, padding){
  this.marker_ = marker;
  this.text_ = text;
  this.padding_ = padding;
}

Tooltip.prototype = new GOverlay();

Tooltip.prototype.initialize = function(map){
  var div = document.createElement("div");
  div.appendChild(document.createTextNode(this.text_));
  div.className = 'tooltip';
  div.style.position = 'absolute';
  div.style.visibility = 'hidden';
  map.getPane(G_MAP_FLOAT_PANE).appendChild(div);
  this.map_ = map;
  this.div_ = div;
}

Tooltip.prototype.remove = function(){
  this.div_.parentNode.removeChild(this.div_);
}

Tooltip.prototype.copy = function(){
  return new Tooltip(this.marker_,this.text_,this.padding_);
}

Tooltip.prototype.redraw = function(force){
  if (!force) return;
  var markerPos = this.map_.fromLatLngToDivPixel(this.marker_.getPoint());
  var iconAnchor = this.marker_.getIcon().iconAnchor;
  var xPos = Math.round(markerPos.x - this.div_.clientWidth / 2);
  var yPos = markerPos.y - iconAnchor.y - this.div_.clientHeight - this.padding_;
  this.div_.style.top = yPos + 'px';
  this.div_.style.left = xPos + 'px';
}

Tooltip.prototype.show = function(){
  this.div_.style.visibility = 'visible';
}

Tooltip.prototype.hide = function(){
  this.div_.style.visibility = 'hidden';
}
