//
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("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 += $("#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) {

  var side_listings_html = '';

  /* 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 === false && jsonData.markers[i].point != undefined) {

          /* Create Marker */
          var marker = createMarker(jsonData.markers[i].point, jsonData.markers[i].label, jsonData.markers[i].html);
          marker.details = createDetails(
                                jsonData.markers[i].id,
                                jsonData.markers[i].image,
                                jsonData.markers[i].price,
                                jsonData.markers[i].bedrooms,
                                jsonData.markers[i].bathrooms,
                                jsonData.markers[i].link
                                );
          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();
  }

  var side_html = '';
  for (var i = 0; i < gmarkers.length; i++) {
    side_html += gmarkers[i].marker.details;
  }
  $('div#map-listings-container-inner').html(side_html);

  /* 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 createDetails(id, image, price, bedrooms, bathrooms, link) {
    var html = '<div class="idx-listing clearfix">'
    + '<div class="imgset"><a href="javascript:{}" onclick="resultClick(\'' + id + '\');"><img src="' + image + '" class="thumb"></a></div>'
    + '<div class="idx-datagrp"><div class="idx-dataset"><div class="idx-data price"><span class="key">Price:</span><span class="val"> ' + price + '</span></div></div>'
    + '<div class="idx-dataset"><div class="idx-data mls"><span class="key">MLS#:</span><span class="val"> ' + id + '</span></div></div>';

	if (bedrooms != 0) {
		html = html + '<div class="idx-dataset"><span class="idx-data beds"><span class="key">Beds:</span><span class="val"> ' + bedrooms + '</span></span> ';
		html = html + '<span class="idx-data baths"><span class="key">Baths:</span><span class="val"> ' + bathrooms + '</span></span></div>';
	}


    html = html + '<div class="btnset"><a href="' + link + '" target="_blank">View Details</a><img src="/idx/img/fmls.jpg"></div>'
    + '</div></div>' + "\n";

    return html;
}

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)
  ]);

}

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();
    images[marker['marker'].getId()] = null;
    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;
}

function resultClick (mlsId) {

    for (var i = 0; i < gmarkers.length; i++) {
		if (gmarkers[i].id == mlsId) {
	        ihtml  = htmls[gmarkers[i].marker.getId()];
            gmarkers[i].marker.openInfoWindowTabsHtml([
                new GInfoWindowTab("Details", ihtml)
            ]);
		}
	}
}

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