var map = null;
//var label = null;
var control = null;
var i = 0;
var unmappedCount = 0;
//
var baseIcon = null;
var HouseIcon = null;
//
var maxMappedListings = 200;
var gmarkers = [];
//var gobjects = [];
var images   = [];
var labels   = [];
/* Coloured Icons */
var Icon1 = null;
var Icon2 = null;
var Icon3 = null;
var Icon4 = null;
var Icon5 = null;
/* JSON Response */
var JSON = null;
var pagelimit = 5;
var mouseover = false;
var baseIcon = null;

function loadMap () {

  /* baseIcon */
//  baseIcon            = new GIcon();
//  baseIcon.image      = '/idx/images/house-icon.png';
//  baseIcon.iconSize   = new GSize(12, 20);
//  baseIcon.shadowSize = new GSize(0,0);
//  baseIcon.iconAnchor = new GPoint(0, 0);
//  baseIcon.shadow     = '/idx/images/house-icon-shadow.png';

  baseIcon = new GIcon();
  baseIcon.image      = '/idx/images/house-icon-black.png';
  baseIcon.shadow = "/idx/images/house-icon-shadow.png";
  baseIcon.iconSize = new GSize(14, 17);
  baseIcon.shadowSize = new GSize(17, 17);
  baseIcon.iconAnchor = new GPoint(0, 0);
  baseIcon.infoWindowAnchor = new GPoint(0, 0);
  baseIcon.infoShadowAnchor = new GPoint(0, 0);

  HouseIcon = new GIcon(baseIcon, '/idx/images/house-icon-black.png', null, '/idx/images/house-icon-shadow.png');

  /* Coloured Icons */
  Icon1 = new GIcon(baseIcon, '/idx/images/markers/lightgreen.png');
  Icon2 = new GIcon(baseIcon, '/idx/images/markers/green.png');
  Icon3 = new GIcon(baseIcon, '/idx/images/markers/blue.png');
  Icon4 = new GIcon(baseIcon, '/idx/images/markers/darkblue.png');
  Icon5 = new GIcon(baseIcon, '/idx/images/markers/red.png');

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

  /* 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();
  });

  // activate correct radio button on load if cookie is set
//  var selectLayer = getLayerFromCookie().toLowerCase();
//  if (document.getElementById(selectLayer)) {
//      document.getElementById(selectLayer).checked = true;
//  }


}

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

function search_new () {
  // hide search message
  $('p#search_message').html('Loading Search Results...');
  /* Show Loading Control */
  control.show();
  /* Clean Map */
  clean_map();
  /* Build Query String */
  queryString  = '?' + $("#search_form").formSerialize();
  //queryString += "&longitude=" + map.getCenter().lng() + "&latitude=" + map.getCenter().lat();
  showLayer(null);
  //$.get("/idx/map/search.php" + queryString, function (jsonData) { alert(jsonData) });
  $.getJSON("/idx/map/search.php" + queryString, function (jsonData) { process_it(jsonData, 0) });

}

function clean_map () {
  /* Clear Results */
  mapped_results = [];
  /* Clear Overlays */
  map.clearOverlays();
  /* Clear Side Results */
  $('div#map-listings-container-inner').empty();
  /* Re-Add BpLabel */
  //map.addOverlay(label);
}

//process_it = function (json_file) {
process_it = function (jsonData, resultindex) {

  clean_map();

  JSON = jsonData;

  $('#debug').html(jsonData.search_query);

  var html = '';
  unmappedCount = '';

  //alert(jsonData.search_query);
  //alert(jsonData.message);

  /* Get JSON Response */
  //var jsonData = eval('(' + jsonData + ')');

  /* Center Map */
  if (jsonData.center) {
      map.setCenter(jsonData.center);
  }

  resultindex = (resultindex < jsonData.total) ? resultindex : jsonData.total - pagelimit
  resultindex = (resultindex < 0) ? 0 : resultindex;

  listlimit = (resultindex + pagelimit);
  listlimit = (listlimit < jsonData.total) ? listlimit : jsonData.total;

  /* Parser Marker Data  */
  for (var i = 0; i < jsonData.markers.length; i++) {
  //for (var i = resultindex; i < listlimit; i++) {
	  /* Check for Cached Marker */
	  if (mapped_results[jsonData.markers[i].id] == undefined) {
		  /* Add Marker to Results Cache */
		  mapped_results[jsonData.markers[i].id] = jsonData.markers[i].id;
		  /* Create Marker */
		  if (jsonData.markers[i].point) {
		      //markerIcon = selectIcon(jsonData.markers[i].price);
		      markerIcon = baseIcon;
			  var marker = createMarker(jsonData.markers[i].point, jsonData.markers[i].label, markerIcon);
			  map.addOverlay(marker);
			  /* Add Event Listeners To Marker */
			  var target = marker.getEventTarget();
			  //if (target) {
    			  //GEvent.bindDom(target, 'click', marker, onMouseClick);
		          GEvent.bindDom(target, 'mouseover', marker, onMouseOver);
			      GEvent.bindDom(target, 'mouseout', marker, onMouseOut);
			  //}

			  /* Add Data To Collections */
			  var index = gmarkers.length;
			  gmarkers[index]           = [];
			  gmarkers[index]['id']     = jsonData.markers[i].id;
			  gmarkers[index]['marker'] = marker;
			  //
			  images[marker.getId()]   = jsonData.markers[i].image;
			  labels[marker.getId()]   = jsonData.markers[i].label;
			  /****/
			  /*
			  alert(marker.getId());
			  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;
			  */
			  //for (var varname in gobjects[marker.getId()]) {
				  //alert('gobjects[marker.getId()][\''+ varname +'\'] is ' + gobjects[marker.getId()][varname]);
			  //}
			  /****/
		  } else {
			  unmappedCount++;
		  }
		  if (i < listlimit) {
		      html = html + jsonData.markers[i].list;
		  }
	  }
  }

  back = (resultindex - pagelimit);
  back = (back < 0) ? 0 : back;

  html = html + '<a class="pag back" href="javascript:void(0);" onclick="paginate(JSON, ' + back + ');">« back</a>';

  html = html + '<a class="pag next" href="javascript:void(0);" onclick="paginate(JSON, ' + listlimit + ');">next »</a>';

  /* Unmapped Results */
  $('div#map-listings-container-inner').empty();
  $('div#map-listings-container-inner').append(html);

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

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

  /* Show Results Message */
  //$('p#search_message').fadeIn('slow');
  //$('p#map-action-container').val(jsonData.message);

}

//process_it = function (json_file) {
paginate = function (jsonData, resultindex) {

  JSON = jsonData;

  var html = '';

  listlimit = (resultindex + pagelimit);
  listlimit = (listlimit < jsonData.total) ? listlimit : jsonData.total;

  /* Parser Marker Data  */
  for (var i = resultindex; i < listlimit; i++) {
	  /* Check for Cached Marker */
	  html = html + jsonData.markers[i].list;
  }

  back = (resultindex - pagelimit);
  back = (back < 0) ? 0 : back;

  html = html + '<a class="pag back" href="javascript:void(0);" onclick="paginate(JSON, ' + back + ');">« back</a>';
  html = html + '<a class="pag next" href="javascript:void(0);" onclick="paginate(JSON, ' + listlimit + ');">next »</a>';

  /* Unmapped Results */
  $('div#map-listings-container-inner').empty();
  $('div#map-listings-container-inner').append(html);

}


function createMarker(point, name, useIcon) {
  /* Create & Return BpMarker */
  var marker = new BpMarkerLight(point, { icon: useIcon });
  //marker.setTooltip(label);
  return marker;
}

function onMouseOver() {
  mouseover = true;
  //this.setImage('/idx/images/house-icon-over.png');
  // get tooltip text
  ilabel = labels[this.getId()];

  //
  var offset = map.fromLatLngToContainerPixel(this.getPoint());
  //var offset = map.fromLatLngToContainerPixel(this.getTooltipPoint());

  $('#map-label').css({
      top:  $('#map-container-inner').offset().top  + offset.y + 10 + 'px',
      left: $('#map-container-inner').offset().left + offset.x + 10 + 'px'
  });

  $('#map-label').html(ilabel);
  $('#map-label').show();

  // show tooltip
  //label.setHtml(ilabel);
  //alert(ilabel);
  //label.setPoint(this.getTooltipPoint());
  //label.show();
  //label.hide();

}

function onMouseOut() {
  //this.setImage('/idx/images/house-icon.png');
  setTimeout(function() {
     if (!mouseover) {
        //label.hide();
        $('#map-label').hide();
     }
  }, 6000);
  mouseover = false;
}


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();
    map.removeOverlay(marker['marker']);
}

  function resultClick (mls_number) {
      // find marker
      var marker = false;
      for (i in gmarkers) {
          if (gmarkers[i]['id'] == mls_number) {
              marker = gmarkers[i]['marker'];
              break;
          }
      }
      if (marker) {
          //ihtml  = htmls[marker.getId()];
          //iimage = images[marker.getId()];
          //marker.openInfoWindowHtml(ihtml);
      } else {
          alert('This listing could not be shown on the map.');
      }
  }

function selectIcon (price) {
    if (price <= 150000) {
        return Icon1;
    } else if (price <= 300000) {
        return Icon2;
    } else if (price <= 500000) {
        return Icon3;
    } else if (price <= 1000000) {
        return Icon4;
    } else {
        return Icon5;
    }
}
