//Map variables
var map;
var geocoder = new GClientGeocoder();
var map_init = false;
var focus_icon = "tpl/default/images/blue_marker.png";
var unfocus_icon = "http://www.google.com/mapfiles/marker.png";

//Sidebar variables
var wndo;
var results_offsetTop = 150;
var results_offsetBottom = 115;

//xml Variables
var xmlSearch = "/inc/search_xml.php";
var xslUrls = ["/inc/search_results.xsl"];
var xslDoms = new Array();
xsltdebug = false;
logging__ = false;
var xmlHttpResult;

//result variables
var hashtable = $H();
var total_results;
var all_listings = new Array();
var markers = new Array();
var focused="";
var nomarker_focused="";

var returned_results = 30;
var results_per_page = 10;
var current_page = 1;
var results;
var base_page;


function init(){
  //if there are parameters, which set the flag form_submit, submit the Form
  if(form_submit){
    formSubmit(document.forms['search_form']);
  }
}

function formSubmit(formElement, paging){
  loading(true);
  if(!map_init){
    document.getElementById("map_image").style.display = 'none';
    map = new GMap2(document.getElementById("map"));
    map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl());
    map.setCenter(new GLatLng( -84.3897, 33.7545), 3, G_SATELLITE_MAP);
    map_init = true;
  }
  if(!paging){
    document.getElementById("PageNum").value = 1;
    current_page = 1;
  }
  var form_data = formData2QueryString(formElement);
  xmlhttpPost(xmlSearch, form_data, 'storeXmlResults', '', 'GET');
  //document.getElementById("debug").innerHTML = xmlSearch+"?"+form_data;
}

function storeXmlResults(xmlHttpReq){
  //document.getElementById("debug").innerHTML = "<pre>"+xmlHttpReq.responseText+"</pre>";
  xmlHttpResult = xmlHttpReq;
  showResults();
}

function resetGlobals(){
  map.clearOverlays();
  document.getElementById("results").innerHTML           = "";
  document.getElementById("prev").innerHTML             = "";
  document.getElementById("results_navigation_text").innerHTML   = "";
  document.getElementById("next").innerHTML             = "";
  document.getElementById("prev2").innerHTML             = "";
  document.getElementById("results_navigation_text2").innerHTML   = "";
  document.getElementById("next2").innerHTML             = "";

  //reset internal marker/listing references
  hashtable       = $H();
  markers         = new Array();
  focused        = "";
  nomarker_focused   = "";
}


/* Map Functions */

function createFromAddress(listing) {
  geocoder.getLatLng(listing.address, 
    function(point) {
      if(!point) {
        createOnclick(document.getElementById("listing_"+listing.id), listing.id);
      }else{
        listing.point = point;
        listing.coord = point.toString();
        createMarker(listing);
      }
    }
  );
}

function createMarker( listing) {
  var coord = listing.coord;
  var index = listing.index;

  if( hashtable[coord] ) {
    var entry = hashtable[coord];
    if(!entry.ids[listing.id]){
      index = entry.listings.length;
      entry.ids[listing.id] = index;
      entry.listings.push(listing);
      all_listings.push(listing);
    }
  }else{
    var ids = new $H();
    ids[listing.id] = index;
    var listings = new Array();
    listings.push(listing);
    all_listings.push(listing);

    var marker = new PdMarker(listing.point);

    var entry = new Entry(listing.point, ids, listings, marker);
    hashtable[coord] = entry;

    GEvent.addListener(marker, "click", function() {
      openWindow(coord, index);
    });

    GEvent.addListener(marker, "infowindowclose", function() {
      closeWindow();
    });

    map.addOverlay(marker);

    var icon = marker.getIcon();
    icon.image = unfocus_icon;
    marker.setIcon(icon);
    markers.push(marker);

    zoomAndRecenterMap();
  }
  
  //link side panel to action and marker
  document.getElementById("listing_"+listing.id).onclick = function() {
      openWindow(coord, index);
  }

}

/* Display Functions */

function loading(display){
  if(document.getElementById('loading')){
    if(display){
      document.body.style.cursor = "wait";
      document.getElementById('loading').style.display = "block";
    }else{
      document.body.style.cursor = "default";
      document.getElementById('loading').style.display = "none";
    }
  }
}

function showResults(){
  if(xslDoms.length == 0){
    loadXsl(0);
    return;
  }
  map.setMapType(G_HYBRID_MAP);
  resetGlobals();

  if(xmlHttpResult.responseXML.getElementsByTagName("result").length > 0){
    var parameters = xmlHttpResult.responseXML.getElementsByTagName("parameters");

    returned_results = Number(getTagData(parameters[0],"Rows"));
    showUnits();

    //Display Parameters
    if(parameters.length > 0){
      var PropertyTotal = Number(getTagData(parameters[0],"PropertyTotal"));
      var PageTotal = Math.ceil(PropertyTotal/results_per_page);
      base_page = Number(getTagData(parameters[0],"PageNum"));

      var prev_link = document.getElementById("prev");
      var prev_link2 = document.getElementById("prev2");
      if(current_page > 1){
        prev_link.onclick = function(){
          paginatePage(current_page-1);
          return false;
        }
        prev_link.innerHTML = "&lt; Previous ";

        prev_link2.onclick = function(){
          paginatePage(current_page-1);
          return false;
        }
        prev_link2.innerHTML = "&lt; Previous ";
      }else{
        prev_link.innerHTML = "";
        prev_link2.innerHTML = "";
      }



      document.getElementById("results_navigation_text").innerHTML = "Page "+current_page+" of "+PageTotal;
      document.getElementById("results_navigation_text2").innerHTML = "Page "+current_page+" of "+PageTotal;

      var next_link = document.getElementById("next");
      var next_link2 = document.getElementById("next2");
      if(current_page < PageTotal){
        next_link.onclick = function(){
          paginatePage(current_page+1);
          return false;
        }
        next_link.innerHTML = " Next &gt;";

        next_link2.onclick = function(){
          paginatePage(current_page+1);
          return false;
        }
        next_link2.innerHTML = " Next &gt;";
      }else{
        next_link.innerHTML = "";
        next_link2.innerHTML = "";
      }
    }
  }else{
    document.getElementById("results").innerHTML = "No Results Found";
  }
  loading(false);
}

function showUnits(){
  var results = xmlHttpResult.responseXML.getElementsByTagName("result");
  var results_container = document.getElementById("results");

  var start_page = (current_page-1)%(returned_results/results_per_page);
  if(start_page < 0){
    start_page = 1;
  }
  var end_unit = Math.min((start_page+1)*results_per_page, results.length);

  for(var i=(start_page*results_per_page);i<end_unit;i++){
    var side_div = document.createElement("div");
    side_div.innerHTML = xsltProcess(results[i], xslDoms[0]);
    results_container.appendChild(side_div);

    var listing_id = Number(getTagData(results[i], "id"));
    var latitude = getTagData(results[i], "latitude");
    var longitude = getTagData(results[i], "longitude");

    var address = '';
    address += getTagData(results[i], "STREET_NUMBER") + " ";
    address += getTagData(results[i], "STREET_DIRECTION") + " ";
    address += getTagData(results[i], "STREET_NAME") + " ";
    address += getTagData(results[i], "city") + " ";
    address += getTagData(results[i], "state") + " ";
    address += getTagData(results[i], "zip_code");

    var listing = new Listing(0, listing_id, address);

    createFromAddress(listing);
  }
  /*
  //Add buffer space for results
  var top_spacer = document.createElement("div");
  top_spacer.className = "spacer";
  top_spacer.style.height = results_offsetTop+"px";
  results_container.insertBefore(top_spacer, results_container.firstChild);

  var bottom_spacer = document.createElement("div");
  bottom_spacer.className = "spacer";
  bottom_spacer.style.height = results_offsetBottom+"px";
  results_container.appendChild(bottom_spacer);
  */
  

  setTimeout('loading(false)', 500);
}

function loadXsl(i){
  /*
  var request = GXmlHttp.create();
  request.open("GET", xslUrls[i], true);
  request.onreadystatechange = function() {
    if(request.readyState == 4){
      var xsldoc = request.responseXML;
      xslDoms[i] = xsldoc;
      if(i<xslUrls.length-1){
        loadXsl(i+1);
      }else{
        showResults()
      }
    }
  }
  request.send(null);
  */
  GDownloadUrl(xslUrls[i], function(data, responseCode) {
    xslDoms[i] = xmlParse(data);
    var test = xslDoms[i];
    if(i<xslUrls.length-1) {
      loadxsl(i+1);
    } else {
      showResults();
    }
  });
}


//map/side panel trigger functions for listings with markers
function listing_focus(coord, i){
  listing_unfocus();
  if(focus==coord){
    return false;
  }

  var entry = hashtable[coord]; 

  //Change marker
  var icon = entry.marker.getIcon();
  icon.image = focus_icon;
  entry.marker.setIcon(icon);

  //focus on marker
  map.panTo(entry.point);

  entry.ids.each(function(pair) {
    var listing = document.getElementById("listing_"+pair.key);
    if(pair.value == i){
      listing.className = "focus";
    }else{
      listing.className = "subfocus";
    }
    listing.onclick = function(){
      closeWindow();
    }

    listing.onmouseout = function(){}
    listing.onmouseover = function(){}
  });

  focused = coord;
  return true;
}

function listing_unfocus(){
  if(focused==""){
    return;
  }
  
  var entry = hashtable[focused];

  //Change marker
  var icon = entry.marker.getIcon();
  icon.image = unfocus_icon;
  entry.marker.setIcon(icon);

  entry.ids.each(function(pair) {
    var listing = document.getElementById("listing_"+pair.key);
    listing.className = "unfocus";
    listing.onmouseout = function(){
      this.className = "unfocus";
    }
    listing.onmouseover = function(){
      this.className = "hover_focus";
    }
    var coord = entry.listings[pair.value].coord;
    createOnclick(listing, pair.value, coord);
  });

  focused="";
}

function openWindow(coord, i){
  if(typeof coord != "string")
    coord = coord.toString();
  
  //close noMarker window
  noMarkerClose();

  if(focused!=coord){
    listing_focus(coord, i);
  }
}

function closeWindow(){
  listing_unfocus();
  map.closeInfoWindow();
}

//map/side panel trigger functions for listings without markers
function noMarkerOpen(i){
  //close noMarker window
  noMarkerClose();

  listing_unfocus();
  document.getElementById("nomarker").style.display = "block";

  var listing = document.getElementById("listing_"+i);

  listing.className="focus";

  listing.onclick = function(){
    noMarkerClose();
  };
  listing.onmouseout = function(){};
  listing.onmouseover = function(){};

  window.setTimeout("noMarkerBoxClose()", 2000);
  nomarker_focused = i;
}

function noMarkerBoxClose(){
  document.getElementById("nomarker").style.display = "none";
}

function noMarkerClose(){
  if(nomarker_focused==""){
    return;
  }
  noMarkerBoxClose();

  var listing = document.getElementById("listing_"+nomarker_focused);
  listing.className="unfocus";
  listing.onmouseout = function(){
    this.className = "unfocus";
  };
  listing.onmouseover = function(){
    this.className = "hover_focus";
  };
  createOnclick(listing, nomarker_focused);

  nomarker_focused = "";
}

/* Utility Functions */
function createOnclick(side_elem, id, coord){
  //if coord was passed, then we have a marker to open
  if(coord){
    side_elem.onclick = function(){
      openWindow(coord, id);
    }
  }else{
  //else we need to open the noMarker box
    side_elem.onclick = function(){
      noMarkerOpen(id);
    }
  }
}

function paginatePage(page){
  loading(true);
  current_page = page;
  var real_base_page = 1+((base_page-1)*(returned_results/results_per_page));
  if((page*results_per_page) > (base_page*returned_results)){
    document.getElementById("PageNum").value = base_page+1;
    formSubmit(document.getElementById("search_form"), true);
  }else if((page*results_per_page) < (real_base_page*results_per_page)){
    document.getElementById("PageNum").value = base_page-1;
    formSubmit(document.getElementById("search_form"), true);
  }else{
    showResults();
  }
}

function Listing(index, id, address, coord, point){
  this.index = index;
  this.id = id;
  this.address = address;
  this.coord = coord;
  this.point = point;
}

function Entry(point, ids, listings, marker){
  this.point = point;
  this.ids = ids;
  this.listings = listings;
  this.marker = marker;
}

function zoomAndRecenterMap() {
  var bounds = arrayBounds(markers);
  var center_lat = (bounds.getNorthEast().lat() + bounds.getSouthWest().lat()) / 2.0;
  var center_lng = (bounds.getNorthEast().lng() + bounds.getSouthWest().lng()) / 2.0;
  var center = new GLatLng(center_lat,center_lng)
  var zoom = map.getBoundsZoomLevel(bounds);
  if(zoom < 2){
    zoom = 2;
  }
  map.setCenter(center,zoom);
}

function arrayBounds(ary) {
  // compute the bounds for an array of markers
  var bounds = new GLatLngBounds();
  if (ary && ary.length > 0) {
    for (var i = 0; i < ary.length; i++) {
      var marker = ary[i];
      if (marker) {
        bounds.extend(marker.getPoint());
      }
    }
  }
  return bounds;
}
