//
var map = null;
var label = null;
var control = null;
var i = 0;
//
var baseIcon = null;
var Icon = null;
//
var gobjects = [];
var gmarkers = [];
var images   = [];
var htmls    = [];
var labels   = [];
//

function generateMap () {

  /* Load Map */
  if (GBrowserIsCompatible()) {
      map = new GMap(document.getElementById("mapContainer"));
      map.enableDoubleClickZoom();
      map.centerAndZoom(new GPoint(setLongitude, setLatitude), setZoom);
      map.setMapType(setMapType);
  }

  baseIcon            = new GIcon(G_DEFAULT_ICON);
  HouseIcon = new GIcon(baseIcon, '/idx/img/map-icons/house-icon.png');
  HouseIcon.shadow = '/idx/img/map-icons/shadow-icon.png';
  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 GOverviewMapControl());
  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(), '', null, '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 += $("#search_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 */
  queryString  = '?' + $("#search_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) {

  /* Center Map */
  map.setCenter(jsonData.center);

  /* 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 && jsonData.markers[i].point != undefined) {
          /* 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;
          images[marker.getId()]   = jsonData.markers[i].image;
          htmls[marker.getId()]    = jsonData.markers[i].html;
          labels[marker.getId()]   = jsonData.markers[i].label;

          //
          gobjects[marker.getId()] = new Object();
          gobjects[marker.getId()].mls_number = jsonData.markers[i].id;
          gobjects[marker.getId()].price      = jsonData.markers[i].price;
          gobjects[marker.getId()].bedrooms   = jsonData.markers[i].bedrooms;
          gobjects[marker.getId()].bathrooms  = jsonData.markers[i].bathrooms;
      }
  }

  while (gmarkers.length > maxMappedListings) {
    removeMarker();
  }

  /* Hide Loading Control */
  control.hide();

}

function createMarker(point, name, html) {
  /* Create & Return BpMarker */

  var marker = new BpMarkerLight(point, { icon: HouseIcon });
  //var marker = new BpMarkerLight(point);
  marker.setTooltip(label);
  return marker;
}

function onMouseOver() {
  //this.setImage('http://www.gmaptools.com/images/marker_yellow.png');
  // get tooltip text
  ilabel = labels[this.getId()];
  // show tooltip
  label.setHtml(ilabel);
  label.setPoint(this.getTooltipPoint());
  label.show();
}

function onMouseOut() {
  //this.setImage('http://www.gmaptools.com/images/marker_red.png');
  //this.setImage('[map_icon]');
  label.hide();
}

function onMouseClick() {
  ihtml  = htmls[this.getId()];
  iimage = images[this.getId()];
  //this.openInfoWindowHtml(ihtml);
  this.openInfoWindowTabsHtml([
      new GInfoWindowTab("Details", ihtml)
//      new GInfoWindowTab("Photo", "<img src=\"" + iimage + "\" style=\"width: 265px; height:218px\">"),
//      new GInfoWindowTab("Inquire", "<form id=\"inquireForm\" onsubmit=\"return submitInquiry(this);\"><input type=\"hidden\" name=\"id\" value=\"" + this.getId() + "\"><table width=\"275\"> <tr>  <td align=\"center\" colspan=\"2\"><b>Inquire About Listing # " + gobjects[this.getId()].mls_number + "</b></td> </tr> <tr><td colspan=\"2\">&nbsp;</td></tr> <tr>  <td align=\"center\" colspan=\"2\" id=\"inquiryResponse\">&nbsp;</td> </tr> <tr>  <td align=\"right\"><b>* Full Name:</b></td>  <td align=\"left\"><input type=\"text\" name=\"full_name\" value=\"\" /></td> </tr> <tr>  <td align=\"right\"><b>Phone:</b></td>  <td align=\"left\"><input type=\"text\" name=\"phone\" value=\"\" /></td> </tr> <tr>  <td align=\"right\"><b>* Email:</b></td>  <td align=\"left\"><input type=\"text\" name=\"email\" value=\"\" /></td> </tr> <tr>  <td align=\"right\">&nbsp;</td>  <td align=\"left\"><input type=\"submit\" name=\"submit\" value=\"Send Inquiry\"></td> </tr></table></form>")
  ]);

}

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 submitInquiry(formObj) {
  var inquireName  = formObj.full_name.value;
  var inquirePhone = formObj.phone.value;
  var inquireEmail = formObj.email.value;
  var inquireBody  = htmls[formObj.id.value];
  var queryString = "?full_name=" + inquireName + "&phone=" + inquirePhone + "&email=" + inquireEmail + '&body=' + inquireBody;
  $.get("/idx/map/inquire.php" + queryString, { }, function (responseText) {
      $('#inquiryResponse').html(responseText);
  });
  return false;
}

function removeMarker()
{
    var marker = gmarkers.shift();
    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;