jQuery(document).ready(function() {
	var loading = jQuery("span.loading-indicator");
	var showStates = "";
	var showZips = "";
	
	loading.show();
	
	
	// Initialize Map
	var key="ABQIAAAAXmM1o7y9YlK-CqEfqFE2kRSmJgauZ_Nda6ZQKFuNtJnsi1VurhQmHoKVqDX5sfkXngWdZ3ISxHFzGA";
	if (GBrowserIsCompatible()) {
		var map = new GMap2(document.getElementById("map"));
		var bounds = new GLatLngBounds();
		var geocoder = new GClientGeocoder();
		geocoder.setCache(null);
		map.setCenter(new GLatLng(0, 0), 1);
		map.setUIToDefault();
	}
	
	// Functions
	function updateMap(address,data) {
		if (geocoder) {
			geocoder.getLatLng(
				address,
				function(point) {
					if (!point && address.lastIndexOf(" ") != -1) {
						// Address wasn't found, try again with zipcode
						var zip = address.substring(address.lastIndexOf(" "));
						updateMap(zip,data);
					} else {
						// Set pin normally
						var marker = new GMarker(point);
						
						GEvent.addListener(marker,"click",function() {
							marker.openInfoWindowHtml(data);
						});
						
						map.addOverlay(marker);
						
						bounds.extend(point);
						map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
						
						if (map.getZoom() > 13) {
							// Don't get too close to single result sets
							map.setZoom(13);
						}
					}
				}
			);
		}
	}
	
	// Re-hide form on dealer form change
	jQuery("#dealer-locator-form select").change(function() {
		map.clearOverlays();
		map.setCenter(new GLatLng(0,0), 1);
		bounds = new GLatLngBounds();
		jQuery("#no-dealer-form-wrapper").hide();
		jQuery("div.messaging").empty();
		jQuery("#results").html("<p>Please make a selection with the Dealer Locator above.</p>");
		jQuery("#zip").val("");
	});
		
	// Populate Country dropdown
	var url = "http://www.topconsupport.com/dealers/getCountriesFor/Telematics/?jsoncallback=?";
	jQuery.getJSON(url, function(json) {
		var html = "";
		jQuery.each(json.items, function(i, item) {
			html += '<option value="' + item.Region.id + '">' + item.Region.name + '</option>';
		});
		html += '<option value="Other">Other&hellip;</option>';
		showStates = String(json.regionsWithChildren);
		showZips = String(json.regionsWithZips);
		
		jQuery("#country").append(html);
		loading.hide();
	});
	
	// Populate State dropdown if needed
	jQuery("select#country").change(function() {
		loading.show();
		var countryId = jQuery("select#country").val();
		var url = "http://topconsupport.com/dealers/getStatesFor/Telematics/" + countryId + "/?jsoncallback=?";
		
		if (showStates.indexOf(countryId) != -1) {
			jQuery("label#for-zip").hide();
			// If US, Australia, or Canada
			// State ID becomes parameter
			jQuery(this).attr("name", "");
			jQuery("select#state").attr("name", "data[Territory][region]");
			jQuery("input#zip").val("");
			
			// Reset dropdown list values (for example, if Australia was selected, then reset for US)
			jQuery("select#state option").remove();
			
			jQuery.getJSON(url, function(json) {
				var html = "";
				jQuery.each(json.items, function(i, item) {
					html += '<option value="' + item.Region.id + '">' + item.Region.name + '</option>';
				});
				html += '<option value="Other">Other&hellip;</option>';
				
				jQuery("select#state").append(html);
				jQuery("label#for-state").show();
				
				// Show zip if US
				if (showZips.indexOf(countryId) != -1) {
					jQuery("label#for-zip").show();
				}
			});
		} else {
			// Reset Country ID as parameter
			jQuery("label#for-state, label#for-zip").hide();
			jQuery("select#state").val("");
			jQuery("select#state").attr("name", "");
			jQuery(this).attr("name", "data[Territory][region]");
		}
		loading.hide();
	});
	
	// Retrieve Results
	jQuery("#dealer-locator-form ul.form-buttons input").click(function() {
		loading.show();

		var data = jQuery("#dealer-locator-form").serialize();
		var url = jQuery("form#dealer-locator-form").attr("action") + "?" + data + "&jsoncallback=?";

		jQuery.getJSON(url, function(json) {
			var html = '';

			if (json.items != '') {
				/*log("### start: " + map.getZoom());
				if (json.items.length == 1) {
					map.setZoom(13);
				} else {
					map.setZoom(19);
				}*/
				// Can't guarantee what data will exists for each dealer so display only what's provided
				html = '<ul>';
				jQuery.each(json.items, function(i, dealer) {
					/* ===== Text results ===== */
					html += '<li><ul class="vcard"><li class="fn">';
					if (dealer.website) {
						if (dealer.website.indexOf("http://") == -1) {
							dealer.website = "http://" + dealer.website;
						}
						html += '<a href="' + dealer.website + '" class="url">' + dealer.name + '</a></li>';
					} else {
						html += dealer.name + '</li>';
					}

					if (dealer.address_state_c == null) {
						dealer.address_state_c = dealer.shipping_address_state;
					}

					html += '<li class="adr">';

					if (dealer.address1_c) {
						html += '<span class="street-address">' + dealer.address1_c + " " + dealer.address2_c + '</span><br />';
					}

					html += '<span class="locality">' + dealer.address_city_c + '</span>, <span class="region">' + dealer.address_state_c + '</span> <span class="postal-code">' + dealer.address_zip_postal_c + '</span></li>';

					if (dealer.phone_c) {
						html += '<li class="tel"><span class="type">Phone</span>: <span class="value">' + dealer.phone_c + '</span></li>';
					}

					if (dealer.phone_fax) {
						html += '<li class="tel"><span class="type">Fax</span>: <span class="value">' + dealer.phone_fax + '</span></li>';
					}

					html += '</ul></li><!-- /.vcard -->';
					
					/* ===== Map Results ===== */
					var fullAddress = dealer.address1_c + " " + dealer.address_city_c + " " + dealer.address_state_c + " " + dealer.address_zip_postal_c;
					var data = "<strong>" + dealer.name + "</strong><br />";
					data += dealer.address1_c + " " + dealer.address2_c + "<br />";
					data += dealer.address_city_c + " " + dealer.address_state_c + " " + dealer.address_zip_postal_c + "<br />";
					data += dealer.phone_c;
					
					updateMap(fullAddress,data);
				}); // end jQuery.each()
				html += '</ul>';

				// Clear results div and add most recent request
				jQuery("#results").empty().append(html);
			 	jQuery("#no-dealer-form-wrapper").hide();
			} else {
				// No results returned, update and display no dealer found form
				map.clearOverlays();
				map.setCenter(new GLatLng(0, 0), 1);
				bounds = new GLatLngBounds();
				jQuery("#results").empty();

				var country = jQuery("#dealer-locator-form #country option:selected").text();
				var countryId = jQuery("#dealer-locator-form #country option:selected").val();

				if (showStates.indexOf(countryId) != -1) {
					jQuery(".state_block").show();
				} else {
					jQuery(".state_block").hide();
					jQuery("input.state_block").val("");
				}

				if (showZips.indexOf(countryId) != -1) {
					jQuery(".zip_block").show();
				} else {
					jQuery(".zip_block").hide();
					jQuery("input.zip_block").val("");
				}

				jQuery("#no-dealer-form-wrapper").show();
			}
			loading.hide();
		});
		return false;
	});
});

// Destroy map
jQuery(window).unload(function() {
	GUnload();
});
