var map;
var geocoder;

function load() {
	if (GBrowserIsCompatible()) {
		geocoder = new GClientGeocoder();
		map = new GMap2(document.getElementById('map'));
		map.addControl(new GSmallMapControl());
		map.addControl(new GMapTypeControl());
		map.setCenter(new GLatLng(40, -100), 3);
	}
}

function searchLocations() {
	var address = document.getElementById('addressInput').value;
	geocoder.getLatLng(address, function(latlng) {
		if (!latlng) {
			alert(address + ' not found');
		} else {
			searchLocationsNear(latlng);
		}
	});
}

function searchLocationsNear(center) {
	var radius = document.getElementById('radiusSelect').value;
	var searchUrl = 'inc/mapxml.php?lat=' + center.lat() + '&lng=' + center.lng() + '&radius=' + radius;
	GDownloadUrl(searchUrl, function(data) {
		var xml = GXml.parse(data);
		var markers = xml.documentElement.getElementsByTagName('marker');
		map.clearOverlays();

		var sidebar = document.getElementById('sidebar');
		sidebar.innerHTML = '';
		if (markers.length == 0) {
			sidebar.innerHTML = '<p><strong>No results found. Please try a different location.<strong>';
			map.setCenter(new GLatLng(40, -100), 4);
			return;
		} else {
			sidebar.innerHTML = '<ol id="dealers"></ol>';
			sidebar = document.getElementById('dealers');
		}

		var bounds = new GLatLngBounds();
		for (var i = 0; i < markers.length; i++) {
			var loc = {
				name: markers[i].getAttribute('name'),
				address: markers[i].getAttribute('address'),
				city: markers[i].getAttribute('city'),
				state: markers[i].getAttribute('state'),
				zip: markers[i].getAttribute('zip'),

				phone: markers[i].getAttribute('phone'),
				fax: markers[i].getAttribute('fax'),
				email: markers[i].getAttribute('email'),
				contact: markers[i].getAttribute('contact'),

				distance: parseFloat(markers[i].getAttribute('distance')),
				point: new GLatLng(
					parseFloat(markers[i].getAttribute('lat')),
					parseFloat(markers[i].getAttribute('lng'))
				)
			};

			var marker = createMarker(loc);
			map.addOverlay(marker);
			var sidebarEntry = createSidebarEntry(marker, loc);
			sidebar.appendChild(sidebarEntry);
			bounds.extend(loc.point);
		}
		map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
	});
}

function createMarker(loc) {
	var marker = new GMarker(loc.point);
	marker.className = 'marker';
	var html = '<div class="bubble">';
	html += '<div class="place-name"><strong>' + loc.name + '</strong></div>';
	html += loc.address;
	html += '<br />'+loc.city+', '+loc.state+'  '+loc.zip;
	if (loc.phone.length) html += '<br /><br /><strong>Phone:</strong> '+loc.phone;
	if (loc.fax.length) html += '<br /><strong>Fax:</strong> '+loc.fax;
	if (loc.contact.length && loc.email.length) {
		html += '<br /><strong>Contact:</strong> <a href="mailto:'+loc.email+'">'+loc.contact+'</a>';
	} else {
		if (loc.contact.length) html += '<br /><strong>Contact:</strong> '+loc.contact;
		if (loc.email.length) html += '<br /><strong>Email:</strong> '+loc.email;
	}
	html += '</div>';
	GEvent.addListener(marker, 'click', function() {
		marker.openInfoWindowHtml(html);
	});
	return marker;
}

function createSidebarEntry(marker, loc) {
	var li = document.createElement('li');
	li.className = 'result';
	var html = '<div class="place-name"><strong>' + loc.name + '</strong> &mdash; ' + loc.city+', '+loc.state +'</div>';
	// html += loc.address + '<br />';
	html += ' &raquo; ' + loc.distance.toFixed(1) + ' miles';
	li.innerHTML = html;
	GEvent.addDomListener(li, 'click', function() {
		GEvent.trigger(marker, 'click');
	});
	GEvent.addDomListener(li, 'mouseover', function() {
		li.className = 'result-hover';
	});
	GEvent.addDomListener(li, 'mouseout', function() {
		li.className = 'result';
	});
	return li;
}
