var map;
var geocoder;
var markers;


function load()
{
  if (GBrowserIsCompatible())
  {
    geocoder = new GClientGeocoder();
    geocoder.setBaseCountryCode('AU');
    map = new GMap2(document.getElementById('map'));
    map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl());
    map.setCenter(new GLatLng(-27, 132), 5);
  }
}


function resetForm()
{
  jQuery( "#search-form" )[0].reset();
  jQuery( "#search-extra" ).empty();
  return false;
}


function searchLocations()
{
  var address;
  var point;
  var searchExtraDiv;
  var ausLocations;
  var count;
  var postCode;

  var stateSelect;
  var state;
  var radiusSelect;
  var radius;
  var storeSelect;
  var exactStore;
  var searchStr;

  address = document.getElementById('search-location').value;
  postCode = document.getElementById('search-postcode').value;
  stateSelect = document.getElementById('search-state');
  state = stateSelect.options[stateSelect.selectedIndex].value;
  radiusSelect = document.getElementById('search-radius');
  radius = radiusSelect.options[radiusSelect.selectedIndex].value;
  storeSelect = document.getElementById('search-store');
  exactStore = storeSelect.options[storeSelect.selectedIndex].value;




  if (exactStore != "" && exactStore != "0")
  {
    searchExactStore(exactStore);
    return false;
  }

  if (state != "" && address == "")
  {
    jQuery("#search-extra").html('Please select a suburb');
    return false;
  }
  else if(state == "" && address != "")
  {
    jQuery("#search-extra").html('Please select a state');
    return false;
  }

  if (postCode != "")
  {
    searchStr = postCode;
  }
  else
  {
    searchStr = address + " " + state;
  }
  searchStr += " AU";

  //alert(searchStr);

/*
  searchExtraDiv = document.getElementById("search-extra");
  searchExtraDiv.style.display = 'none';
*/


  geocoder.getLocations(searchStr, function(locations)
  {
    if (locations.Status.code != "200")
    {
      //alert(searchStr + ' not found');
      displayNotFound();
      return false;
    }

    ausLocations = new Array()
    for (count = 0; count < locations.Placemark.length; count++)
    {
      if (locations.Placemark[count].AddressDetails.Country.CountryNameCode == "AU")
      {
        ausLocations.push(locations.Placemark[count]);
      }
    }


    if (ausLocations.length == 0)
    {
      //alert(searchStr + ' not found');
      displayNotFound();
    }
    else if (ausLocations.length > 0)
    {
      searchLocationsNear(ausLocations[0].Point.coordinates[1], ausLocations[0].Point.coordinates[0], radius, 5);
    }

    else
    {
      //alert('Internal Error');
    }
  });
  return false;
}

function displayNotFound()
{
  jQuery("#search-extra").html('Your search did not match any stores. Please try again.').show();
}



function searchLocationsNear(lat, lng, radius, maxResults)
{

  var center = new GLatLng(lat, lng);
  //var radius = 1000; //document.getElementById('radiusSelect').value;
  var searchUrl = 'getstoredata.php?lat=' + center.lat() + '&lng=' + center.lng() + '&radius=' + radius;
  var searchExtraDiv = document.getElementById("search-extra");
  var zoomLevel;
  var maxResults = 1000;

  //XXX: Hack to disable "more" link

  //alert("Finding nearby stores" + lat + "  " + lng);
  GDownloadUrl(searchUrl, dispSearchResults);

  return false;
}

function searchExactStore(storeID)
{

  var searchUrl = 'getstoredata.php?id='+ storeID;

  GDownloadUrl(searchUrl, dispSearchResults);

  return false;
}


function dispSearchResults(data)
{


    //alert("Call returned.");
    //alert(data);
    var xml = GXml.parse(data);
    markers = xml.documentElement.getElementsByTagName('marker');
    var maxResults = 1000;
    var mapMarkers = new Array();
    map.clearOverlays();

    //alert(markers.length + "");

    var listTable = document.getElementById('store-list-table');
    var listPanel = document.getElementById('list-panel');
    var searchExtra = document.getElementById('search-extra');
    if (markers.length == 0)
    {
      jQuery(searchExtra).html('No results found.');
      map.setCenter(new GLatLng(-27, 132), 5);
      return;
    }

    jQuery(searchExtra).empty();
    jQuery(listTable).empty();

    var listTBody = document.createElement('tbody');
    var headRow = document.createElement('tr');
    var nameTD = document.createElement('th');
    var addrTD = document.createElement('th');
    var phoneTD = document.createElement('th');
    var distanceTD = document.createElement('th');

    
    jQuery(nameTD).html('Name');
    jQuery(addrTD).html('Address');
    jQuery(phoneTD).html('Phone');
    jQuery(distanceTD).html('Distance');

    headRow.className = "header-row";
    headRow.appendChild(nameTD);
    headRow.appendChild(addrTD);
    headRow.appendChild(phoneTD);
    headRow.appendChild(distanceTD);
    listTBody.appendChild(headRow);
    listTable.appendChild(listTBody);
    jQuery(listPanel).show();

    var bounds = new GLatLngBounds();
    var numResults
    numResults = Math.min(markers.length, maxResults);
    for (var i = 0; i < numResults; i++) {
      var name = markers[i].getAttribute('name');
      var address = markers[i].getAttribute('address');
      var suburb = markers[i].getAttribute('suburb');
      var state = markers[i].getAttribute('state');
      var postcode = markers[i].getAttribute('postcode');
      var phone = markers[i].getAttribute('phone');
      var distance = parseFloat(markers[i].getAttribute('distance'));
      var point = new GLatLng(parseFloat(markers[i].getAttribute('lat')),
                              parseFloat(markers[i].getAttribute('lng')));

      var marker = createMarker(point, name, address, suburb, state, postcode, phone, i);
      map.addOverlay(marker);
      var listEntry = createListEntry(marker, markers[i]);
      listTBody.appendChild(listEntry);
      bounds.extend(point);
      mapMarkers.push(marker);
    }

    listPanel.appendChild(listTable);
    zoomLevel = Math.min(map.getBoundsZoomLevel(bounds), 14);
    map.setCenter(bounds.getCenter(), zoomLevel);

    if (mapMarkers.length > 0)
    {
      GEvent.trigger(mapMarkers[0], 'click');
    }

    if (markers.length > maxResults)
    {
      var link = document.createElement('a');
  
      jQuery(link).html("View more");
      link.href = "#";
      link.onclick = new Function ("searchLocationsNear(" + lat + ", " + lng + ", " + radius + ", 10); return false;");
      sidebar.appendChild(link);
    }


}






function createMarker(point, name, address, suburb, state, postcode, phone, markerIndex) {
  var marker = new GMarker(point);
  var fromAddr;
  var toAddr;

  fromAddr = '';
  toAddr = encodeURIComponent(address + ' ' + suburb + ' ' + state + ' ' + postcode);

  var html = '<b>' + name + '</b> <br/>' + address + '<br /> ' + suburb 
	+ ' ' + state + ' ' + postcode + '<br /><br />' + phone
  	+ '<br /><br /><a target="_blank" href="http://maps.google.com.au/maps?daddr=' + toAddr + '">Driving directions</a>';
  GEvent.addListener(marker, 'click', function() {
    marker.openInfoWindowHtml(html);
    updateDetailsPanel(marker, markers[markerIndex]);
  });
  return marker;
}

function createHoursEntry(day, hours)
{
  var label = document.createElement('td');
  var descr = document.createElement('td');
  jQuery(label).html(day);
  label.className = "hours-label";
  jQuery(descr).html(hours);
  descr.className = "hours-details";
  return new Array(label, descr);
}


function createAddress(storeInfo)
{

  var wrapper = document.createElement('h4');
  var address;
  var centreName = storeInfo.getAttribute("centre_name");

  address = "";

  if (centreName != "")
  {
    address += centreName + "<br />";
  }

  address += storeInfo.getAttribute("address") + "<br />" + storeInfo.getAttribute("suburb") + " " + storeInfo.getAttribute("state") + " " + storeInfo.getAttribute("postcode") + "<br />PH: " + storeInfo.getAttribute("phone");

  wrapper.className = "store-details-address";
  jQuery(wrapper).html(address);
  return wrapper;
}


function createOpeningHours(storeInfo)
{
  var div = document.createElement('div');
  var table = document.createElement('table');
  var tBody = document.createElement('tbody');
  var heading = document.createElement('h4');
  var mondayEntry = createHoursEntry("Mon", storeInfo.getAttribute("monday"));
  var tuesdayEntry = createHoursEntry("Tue", storeInfo.getAttribute("tuesday"));
  var wednesdayEntry = createHoursEntry("Wed", storeInfo.getAttribute("wednesday"));
  var thursdayEntry = createHoursEntry("Thu", storeInfo.getAttribute("thursday"));
  var fridayEntry = createHoursEntry("Fri", storeInfo.getAttribute("friday"));
  var saturdayEntry = createHoursEntry("Sat", storeInfo.getAttribute("saturday"));
  var sundayEntry = createHoursEntry("Sun", storeInfo.getAttribute("sunday"));

  jQuery(heading).html("Opening Hours");

  var tRow = document.createElement('tr');
  tRow.appendChild(mondayEntry[0]);
  tRow.appendChild(mondayEntry[1]);
  tBody.appendChild(tRow);

  var tRow = document.createElement('tr');
  tRow.appendChild(tuesdayEntry[0]);
  tRow.appendChild(tuesdayEntry[1]);
  tBody.appendChild(tRow);

  var tRow = document.createElement('tr');
  tRow.appendChild(wednesdayEntry[0]);
  tRow.appendChild(wednesdayEntry[1]);
  tBody.appendChild(tRow);

  var tRow = document.createElement('tr');
  tRow.appendChild(thursdayEntry[0]);
  tRow.appendChild(thursdayEntry[1]);
  tBody.appendChild(tRow);

  var tRow = document.createElement('tr');
  tRow.appendChild(fridayEntry[0]);
  tRow.appendChild(fridayEntry[1]);
  tBody.appendChild(tRow);

  var tRow = document.createElement('tr');
  tRow.appendChild(saturdayEntry[0]);
  tRow.appendChild(saturdayEntry[1]);
  tBody.appendChild(tRow);

  var tRow = document.createElement('tr');
  tRow.appendChild(sundayEntry[0]);
  tRow.appendChild(sundayEntry[1]);
  tBody.appendChild(tRow);


  table.appendChild(tBody);
  div.appendChild(heading);
  div.appendChild(table);
  return div;
}

function createServices(storeInfo)
{
  var wrapper = document.createElement('div');
  var heading = document.createElement('h4');
  var servicesArray;
  var serviceList;
  var i;

 
  servicesArray = storeInfo.getAttribute("services").split(", ");

  jQuery(heading).html("Services");
  heading.className = "store-details-services-heading";
  wrapper.appendChild(heading);
  if (servicesArray.length > 0)
  {

    serviceList = document.createElement('ul');
    for (i=0; i< servicesArray.length; i++)
    {

      var item = document.createElement('li');
      jQuery(item).html(servicesArray[i]);
      serviceList.appendChild(item);
    }
    wrapper.appendChild(serviceList);
  }
  //alert(storeInfo.getAttribute("services"));

  return wrapper;

}

function updateDetailsPanel(marker, storeInfo)
{
  var detailsPanel = document.getElementById('details-panel');
  jQuery(detailsPanel).empty();
  jQuery(detailsPanel).css("padding", "15px");
  detailsPanel.appendChild(createSidebarEntry(marker, storeInfo));
  Cufon.replace('.store-details-heading');
}


function createSidebarEntry(marker, storeInfo) {
  var div = document.createElement('div');
  var addressDiv = document.createElement('div');
  var hoursDiv = document.createElement('div');
  var servicesDiv = document.createElement('div');
  var heading;
  var distance;
  var distanceHeading;
  var distanceText;

  heading = document.createElement('h3');
  jQuery(heading).html("HAIRHOUSE WAREHOUSE<br />" + storeInfo.getAttribute("name"));
  
  addressDiv = createAddress(storeInfo);

  hoursDiv.appendChild(createOpeningHours(storeInfo));

  distance = document.createElement('div');
  distanceHeading = document.createElement('h4');
  distanceText = document.createElement('p');
  jQuery(distanceText).html(storeInfo.getAttribute("distance") + " km");
  jQuery(distanceHeading).html("Distance: ");
  distance.appendChild(distanceHeading);
  distance.appendChild(distanceText);

  servicesDiv = createServices(storeInfo);

  heading.className = "store-details-heading";
  distance.className = "store-details-distance";
  addressDiv.className = "store-details-address";
  hoursDiv.className = "store-details-hours";
  servicesDiv.className = "store-details-services";

  div.appendChild(heading);  
  div.appendChild(addressDiv); 
  div.appendChild(hoursDiv);
  div.appendChild(servicesDiv);
  div.appendChild(distance);

  div.style.cursor = 'pointer';
  div.style.marginBottom = '5px';
  div.className = "store-details";
  GEvent.addDomListener(div, 'click', function() {
    GEvent.trigger(marker, 'click');
  });

  return div;
}

function createListEntry(marker, storeInfo) {
  var row = document.createElement('tr');
  var addressStr;
  var servicesDiv;
  var nameStr;
  var phoneStr;
  var distanceStr;
  var nameCol, addrCol, phoneCol, distanceCol;

  nameStr = storeInfo.getAttribute("name");
  addressStr = storeInfo.getAttribute("address") + ", " + storeInfo.getAttribute("suburb");
  phoneStr = storeInfo.getAttribute("phone");
  distanceStr = storeInfo.getAttribute("distance");

  nameCol = document.createElement('td');
  addrCol = document.createElement('td');
  phoneCol = document.createElement('td');
  distanceCol = document.createElement('td');

  nameCol.className = "store-list-name";
  addrCol.className = "store-list-address";
  phoneCol.className = "store-list-phone";
  distanceCol.className = "store-list-distance";

  jQuery(nameCol).html(nameStr);
  jQuery(addrCol).html(addressStr);
  jQuery(phoneCol).html(phoneStr);
  jQuery(distanceCol).html(distanceStr);
 
  row.appendChild(nameCol); 
  row.appendChild(addrCol);
  row.appendChild(phoneCol);
  row.appendChild(distanceCol);

  row.style.cursor = 'pointer';
  row.className = "store-list-row";
  GEvent.addDomListener(row, 'click', function() {
    GEvent.trigger(marker, 'click');
  });

  return row;
}

jQuery(document).ready(function()
{
  load();
});

jQuery(window).unload( function () { GUnload(); } );
