/**
 * ---------------------- Subversion Information ------------------------------
 * ****************************************************************************
 * $Date: 2009-05-28 14:56:32 -0700 (Thu, 28 May 2009) $
 * $Rev: 596 $
 * $Author: mike $
 *
 * SVN URL of this file
 * $HeadURL: http://hal/svn/cms/trunk/idx/inc/js/map.js $
 * ****************************************************************************
 *
 * @copyright Real Estate Webmasters 2008
 */

//
var map = null;
var label = null;
var control = null;
var i = 0;
//
var baseIcon = null;
var Icon = null;
//
var gmarkers = [];
var htmls    = [];
var labels   = [];
//

function generateMap () {

  /* Load Map */
  if (GBrowserIsCompatible()) {
      map = new GMap(document.getElementById("map-container-inner"));
      map.enableDoubleClickZoom();
      map.centerAndZoom(new GPoint(setLongitude, setLatitude), setZoom);
      map.setMapType(setMapType);
  }

  baseIcon            = new GIcon(G_DEFAULT_ICON);
  HouseIcon = new GIcon(baseIcon, setMapIcon);
  HouseIcon.shadow     = setMapIconShadow;
  HouseIcon.iconSize   = new GSize(32, 28);
  HouseIcon.shadowSize = new GSize(32,28);
  HouseIcon.iconAnchor = new GPoint(12, 27);

  /* Add Map Controls */
  map.addControl(new GLargeMapControl());
  map.addControl(new GMapTypeControl());

  /* Custom Map Controls */
  control = new BpControl(setLoadingMsg, null, G_ANCHOR_TOP_RIGHT, 'noborder');
  map.addControl(control);

  /* Tooltip Label */
  label = new BpLabel(map.getCenter(), '', 'map-label', 'nw', true);
  label.setOpacity(100);
  map.addOverlay(label);

  /* Add Drag End Listener */
  GEvent.addListener(map, "dragend", function() {
      search();
  });

  /* Add Zoom End Listener */
  GEvent.addListener(map, "zoomend", function(oldLevel, newLevel) {
      search();
  });

  /* Search Listings */
  search();

}


function search () {
  // hide search message
  $('p#search_message').html('Loading Search Results...');
  /* Show Loading Control */
  control.show();
  /* Build Query String */
  queryString  = getQueryString() + '&';
  queryString += $("#map_form").formSerialize();
  /* Get Results */
  $.getJSON("/idx/map/search.php" + queryString, function (jsonData) { process_it(jsonData) });
}

function search_new () {
  // hide search message
  $('p#search_message').html('Loading Search Results...');
  /* Show Loading Control */
  control.show();
  /* Clear Results */
  gmarkers = [];
  /* Clear Overlays */
  map.clearOverlays();
  /* Add BpLabel */
  map.addOverlay(label);
  /* Build Query String */
  if ($('select[@name="search_city"]').val() == '') {
      queryString  = getQueryString() + '&';
      queryString += "longitude=" + map.getCenter().lng() + "&latitude=" + map.getCenter().lat() + '&';
  } else {
      queryString = '?';
  }
  queryString += $("#map_form").formSerialize();
  //queryString += "&longitude=" + map.getCenter().lng() + "&latitude=" + map.getCenter().lat();
  $.getJSON("/idx/map/search.php" + queryString, function (jsonData) { process_it(jsonData) });
}

function process_it(jsonData) {

  var side_listings_html = '';

  var bounds = new GLatLngBounds();

  /* Parser Marker Data  */
  for (var i = 0; i < jsonData.markers.length; i++) {
      /* Check for Cached Marker */
      var markerIndex = markerInArray(jsonData.markers[i].id);
      if (markerIndex === false && jsonData.markers[i].point != undefined) {

          bounds.extend(jsonData.markers[i].point);

          /* Create Marker */
          var marker = createMarker(jsonData.markers[i].point, jsonData.markers[i].label, jsonData.markers[i].html);
          map.addOverlay(marker);
          /* Add Evem Listeners To Marker */
          var target = marker.getEventTarget();
          GEvent.bindDom(target, 'click', marker, onMouseClick);
          GEvent.bindDom(target, 'mouseover', marker, onMouseOver);
          GEvent.bindDom(target, 'mouseout', marker, onMouseOut);

          /* Add Data To Colle\ctions */
          var index = gmarkers.length;
	      gmarkers[index]           = [];
		  gmarkers[index]['id']     = jsonData.markers[i].id;
		  gmarkers[index]['marker'] = marker;
          htmls[marker.getId()]    = jsonData.markers[i].html;
          labels[marker.getId()]   = jsonData.markers[i].label;

      }
  }

  while (gmarkers.length > maxMappedListings) {
    removeMarker();
  }

  /* Center Map */
  if (jsonData.center) {
      map.setCenter(jsonData.center);
  } else {
      if (jsonData.markers.length) {
          map.setCenter(bounds.getCenter());
          //map.setZoom(map.getBoundsZoomLevel(bounds));
      }
  }

  /* Hide Loading Control */
  control.hide();

}

function createMarker(point, name, html) {
  /* Create & Return BpMarker */

  var marker = new BpMarkerLight(point, { icon: HouseIcon });
  marker.setTooltip(label);
  return marker;
}

function onMouseOver() {
  // get tooltip text
  ilabel = labels[this.getId()];
  // show tooltip
  label.setHtml(ilabel);
  label.setPoint(this.getTooltipPoint());
  label.show();
}

function onMouseOut() {
  label.hide();
}

function onMouseClick() {
  ihtml  = htmls[this.getId()];
  this.openInfoWindowTabsHtml([
      new GInfoWindowTab("Details", ihtml)
  ]);

}

function getQueryString () {
  /* Get Map Center */
  var centerLng = map.getCenter().lng();
  var centerLat = map.getCenter().lat();
  /* Get Map Bounds */
  var southWest = map.getBounds().getSouthWest().toUrlValue();
  var northEast = map.getBounds().getNorthEast().toUrlValue();
  /* Build Query String */
  queryString  = "?longitude=" + centerLng;
  queryString += "&latitude=" + centerLat;
  queryString += '&south_west=' + southWest;
  queryString += '&north_east=' + northEast;
  //
  return queryString;
}

function removeMarker()
{
    var marker = gmarkers.shift();
    htmls[marker['marker'].getId()] = null;
    labels[marker['marker'].getId()] = null;
    map.removeOverlay(marker['marker']);
}

function markerInArray(mlsId)
{
	for (var i = 0; i < gmarkers.length; i++) {
		if (gmarkers[i].id == mlsId) {
			return i;
		}
	}

	return false;
}

window.onload = generateMap;
window.onunload = GUnload;
