var map;
var geocoder;
var address = $('#default_search');
var country = $('#country');
var search = $('.submit');
var radius = $("#search_radius");
var loading = $("div#search_results div.loading");
var results = $("#search_results");
var international_flag = 0;

$(document).ready(function(){

	 if (GBrowserIsCompatible()) {
        geocoder = new GClientGeocoder();    
	    map = new GMap2(document.getElementById('canvas'));
	    map.setCenter(new GLatLng(37.4419, -98.1419), 3);
		map.addControl(new GLargeMapControl());
	    map.addControl(new GMapTypeControl());
	    
      }
	
	address.keyup(function(){ 	
		swap_search();
	});
	
	radius.change(function(){
		swap_search();
	});
	
	address.click(function(){
		if (default_address())
		{
			address.val('');
		}
	});
	
	search.click(function(){
		if(international_flag == 1)
		{
			searchInternational(country.val());
		} 
		else if(check_fields())
		{
			results.html(" ");
			loading.show();
			do_search();
		} 
	});
	
	country.change(function(){
		enable_search();
	});
	
	$('#int_search').click(function () {
      if ($("#int_info").is(":hidden")) {
        $("#int_info").slideDown("fast");
        international_flag = 1;
      } else {
        $("#int_info").hide();
        international_flag = 0;
      }
    });

	
});


function swap_search()
{
	if(check_fields())
	{
		enable_search();
	} else {
		disable_search();
	}
}

function check_fields()
{
	if(!default_address() && radius_set() && (address.val() != '')){
	
		return true;
	} else {
		return false;
	}
}

function enable_search()
{
	search.removeAttr("disabled");	
}

function radius_set()
{
	if(radius.val() > 0) 
	{
		return true;
	} else {
		return false;
	}
}

function default_address()
{
	if (address.val() == "City and State or Zip")
	{
		return true;
	} else {
		return false;
	}
}

function disable_search()
{
	search.attr("disabled","disabled");
}

function do_search()
{
	searchLocations();
}

function searchLocations() {
 addr_value = address.val();
 
 if (addr_value == "england" || addr_value == "England") {
 	addr_value = "london great britain";
 }
 

 geocoder.getLatLng(addr_value, function(latlng) {
   if (!latlng) {
     alert(address.val() + ' not found');
   } else {
     searchLocationsNear(latlng);
   }
 });
}

function searchLocationsNear(center)
{
	 the_radius = radius.val();
	 
	 if (international_flag == 1) { 
	 	the_radius = 1000;
	 }
	 
     var searchUrl = 'genxml.php?lat=' + center.lat() + '&lng=' + center.lng() + '&radius=' + the_radius;
     GDownloadUrl(searchUrl, function(data) {
       var xml = GXml.parse(data);
       var markers = xml.documentElement.getElementsByTagName('marker');
       map.clearOverlays();
	   results.html("");
       if (markers.length == 0) {
       
       	 loading.hide();
       	 results.html("<p style='padding: 5px;'>We're sorry, no results were found.  <br />Please increase your search radius and try again.<p>");
         map.setCenter(new GLatLng(37.4419, -98.1419), 3);
         return;
       }

       var bounds = new GLatLngBounds();
       for (var i = 0; i < markers.length; i++) {
         var name = markers[i].getAttribute('name');
         var address = markers[i].getAttribute('address');
         var city = markers[i].getAttribute('city');
         var state = markers[i].getAttribute('state');
         var phone = markers[i].getAttribute('phone');
         var zip = markers[i].getAttribute('zip');
         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, city, state, phone, zip);
         update_results(marker, name, address, city, state, phone, zip, distance);
         map.addOverlay(marker);
         bounds.extend(point);
       }
       map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
       loading.hide();
     });
}

function searchInternational(country)
{
	 
     var searchUrl = 'genxml.php?cntry=' + country;
     GDownloadUrl(searchUrl, function(data) {
       var xml = GXml.parse(data);
       var markers = xml.documentElement.getElementsByTagName('marker');
       map.clearOverlays();
	   results.html("");
       if (markers.length == 0) {
       
       	 loading.hide();
       	 results.html("<p style='padding: 5px;'>We're sorry, no results were found.  <br />Please increase your search radius and try again.<p>");
         map.setCenter(new GLatLng(37.4419, -98.1419), 3);
         return;
       }

       var bounds = new GLatLngBounds();
       for (var i = 0; i < markers.length; i++) {
         var name = markers[i].getAttribute('name');
         var address = markers[i].getAttribute('address');
         var city = markers[i].getAttribute('city');
         var state = markers[i].getAttribute('state');
         var phone = markers[i].getAttribute('phone');
         var zip = markers[i].getAttribute('zip');
         var email = markers[i].getAttribute('email');
         var distance = parseFloat(markers[i].getAttribute('distance'));
         var point = new GLatLng(parseFloat(markers[i].getAttribute('lat')),
                                 parseFloat(markers[i].getAttribute('lng')));
         
         var marker = createEmailMarker(point, name, address, city, state, phone, zip, email);
         update_international_results(marker, name, address, city, state, phone, zip, email,distance);
         map.addOverlay(marker);
         bounds.extend(point);
       }
       map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
       loading.hide();
     });
}

function createMarker(point, name, address, city, state, phone, zip) {
  var marker = new GMarker(point);
  var html = '<b>' + name + '</b> <br/>' + address + '<br />' + city + ", " + state + " " + zip + "<br />" + phone;
  GEvent.addListener(marker, 'click', function() {
    marker.openInfoWindowHtml(html);
  });
  return marker;
}

function createEmailMarker(point, name, address, city, state, phone, zip, email) {
  var marker = new GMarker(point);
  var html = '<b>' + name + '</b> <br/>' + address + '<br />' + city + ", " + state + " " + zip + "<br />" + phone + "<br />" + "<a href='mailto:" + email + "'>" + email + "</a>";
  GEvent.addListener(marker, 'click', function() {
    marker.openInfoWindowHtml(html);
  });
  return marker;
}

function update_results(marker, name, address, city, state, phone, zip, distance)
{
	var div = document.createElement('div');
      var html = '<b>' + name + '</b> (' + distance.toFixed(1) + ' mi.)<br/>' + address + '<br />' + city + ", " + state + " " + zip + "<br />" + phone;
      div.style.padding = "5px";
      div.innerHTML = html;
      div.style.cursor = 'pointer';
      div.style.marginBottom = '5px'; 
      GEvent.addDomListener(div, 'click', function() {
        GEvent.trigger(marker, 'click');
      });
      GEvent.addDomListener(div, 'mouseover', function() {
        div.style.backgroundColor = '#aacbf3';
      });
      GEvent.addDomListener(div, 'mouseout', function() {
        div.style.backgroundColor = '#d0dae2';
      });
      
      results.append(div);
}

function update_international_results(marker, name, address, city, state, phone, zip, email, distance)
{
	var div = document.createElement('div');
      var html = '<b>' + name + '</b> <br/>' + address + '<br />' + city + ", " + state + " " + zip + "<br />" + phone + "<br /><a href='mailto:" + email + "'>" + email + "</a>";
      div.style.padding = "5px";
      div.innerHTML = html;
      div.style.cursor = 'pointer';
      div.style.marginBottom = '5px'; 
      GEvent.addDomListener(div, 'click', function() {
        GEvent.trigger(marker, 'click');
      });
      GEvent.addDomListener(div, 'mouseover', function() {
        div.style.backgroundColor = '#aacbf3';
      });
      GEvent.addDomListener(div, 'mouseout', function() {
        div.style.backgroundColor = '#d0dae2';
      });
      
      results.append(div);
}

