var map = null;
var geocoder = null;

var Ultimate = {
	initialize: function(){
		if(GBrowserIsCompatible()){
			geocoder = new GClientGeocoder();
			if($("rentals-map")){
				map = new GMap2($("rentals-map"));
				map.setUIToDefault();
				RentalsPage.load_cities();
			}
			if($("houses-map")){
				map = new GMap2($("houses-map"));
				map.setUIToDefault();
				HousesPage.load_cities();
			}
			if($("rental-map")){
				map = new GMap2($("rental-map"));
				map.setUIToDefault();
				RentalPage.load_map();
			}
			if($("house-map")){
				map = new GMap2($("house-map"));
				map.setUIToDefault();
				HousePage.load_map();
			}
			if($("commercial-map")){
				map = new GMap2($("commercial-map"));
				map.setUIToDefault();
				CommercialPage.load_map();
			}
		}
	},
	
	clear_map: function(){
		if(map && geocoder){
			map.clearOverlays();
		}
	},
	
	center_map_on: function(address,city){
		if(map && geocoder){
			var center_address = (address) ? address + " " + city + " AZ" : city + " AZ";
			var zoom = (address) ? 12 : 9;
			geocoder.getLatLng(
				center_address,
				function(point){ if(point){ map.setCenter(point, zoom); } }
			);
		}
	},
	
	mark_on_map: function(full_address, marker_html){
		if(map && geocoder){
			if(Object.isUndefined(marker_html)) marker_html = full_address;
			geocoder.getLatLng(
				full_address,
				function(point){
					if(point){
						var marker = new GMarker(point);
						GEvent.addListener(marker,"click", function(){
							marker.openInfoWindowHtml(marker_html);
						});
						map.addOverlay(marker);
					}
				}
			);
		}
	},
	
	toggle_text_field: function(field,text) {
		if(field.value == ""){
			field.value = text;
			field.addClassName("dulled");
		}
		field.observe("focus", function() {
			if(this.value == text){
				this.value = "";
				this.removeClassName("dulled");
			}
		});
		field.observe("blur", function() {
			if(this.value == null || this.value == ''){
				this.value = text;
				this.addClassName("dulled");
			}
		});
	},
	
	first_city_in_list: function() {
		if($('map-cities')){
			return $('map-cities').descendants()[0].descendants()[0].innerHTML;
		}
		return "Peoria";
	}
}

var RentalsPage = {
	load_cities: function(){
		new Ajax.Request("/main/cities",{
			method: "post",
			parameters: {rentals: true},
			onSuccess: function(transport){
				transport.responseJSON.each(function(json){
					var city = json["rental"]["city"];
					var count = json["rental"]["count"];
					var city_li = new Element("li",{id: city});
					var a_text = city + " (" + count + ")";
					var city_a = new Element("a", {id: city, href: "#"}).update(a_text);
					city_a.observe("click", RentalsPage.load_markers);
					city_li.insert(city_a);
					$("map-cities").insert(city_li,{position: "bottom"});
				});
				var view_all = new Element("a", {id: "all_cities", href: "/rentals"}).update("View All");
				var all_li = new Element("li",{id: "view_all"});
				all_li.insert(view_all);
				$("map-cities").insert(all_li,{position: "bottom"});
			},
			onComplete: RentalsPage.load_markers,
			onFailure: function(transport){
				alert("Failed to get Cities");
			}
		});
	},
	
	load_markers: function() {
		Ultimate.clear_map();
		var center = (!this.id) ? "Phoenix" : this.id;
		Ultimate.center_map_on(null,center);
		var city = (!this.id) ? null : this.id;
		RentalsPage.load_rental_markers(city);
		RentalsPage.load_rental_table(city);
	},
	
	load_rental_markers: function(city){
		new Ajax.Request("/rentals/cityfilter",{
			method: "post",
			parameters: {city: city},
			onSuccess: function(transport){
				transport.responseJSON.each(function(json){
					var address = json["address"];
					var city = json["city"];
					var zip = json["zip"];
					var full_address = address + " " + city + ", AZ " + zip;
					var marker_html = "<address>" + address + "<br \/>" + city + ", AZ " + zip + "<\/address>";
					marker_html += "<br \/><a href=\"/rentals/" + json["id"] + "\">View Property</a>";
					if(json["photo"] !== ""){
						marker_html = "<img class='google-photo' src=" + json["photo"] + "\/><br \/>" + marker_html;
					}
					Ultimate.mark_on_map(full_address,marker_html);
				});
			},
			onFailure: function(transport){
				alert("Failed to get City Rentals");
			}
		});
	},
	
	load_rental_table: function(city) {
		new Ajax.Updater({success:'rentals-table'},
			'/rentals/citylist',
			{
				evalScripts: false,
				parameters: {city: city},
				onComplete: SortableTable.find
			});
	}
}

var RentalPage = {
	load_map: function(){
		if(map && geocoder){
			// rental_address is built on the views/rentals/show view.
			var address = rental_address["rental"]["address"];
			var city = rental_address["rental"]["city"];
			var zip = rental_address["rental"]["zip"];
			var full_address = address + " " + city + ", AZ " + zip;
			Ultimate.center_map_on(address,city);
			var marker_html = "<address>" + address + "<br \/>" + city + ", AZ" + zip + "<\/address>";
			Ultimate.mark_on_map(full_address, marker_html);
		}
	}
}

var HousesPage = {
	load_cities: function() {
		new Ajax.Request("/main/cities",{
			method: "post",
			parameters: {houses: true},
			onSuccess: function(transport){
				transport.responseJSON.each(function(json){
					var city = json["house"]["city"];
					var city_li = new Element("li",{id: city});
					var city_a = new Element("a", {id: city, href: "#"}).update(city);
					city_a.observe("click", HousesPage.load_markers);
					city_li.insert(city_a);
					$("map-cities").insert(city_li,{position: "bottom"});
				});
			},
			onComplete: HousesPage.load_markers,
			onFailure: function(transport){
				alert("Failed to get Cities");
			}
		});
	},
	
	load_markers: function() {
		Ultimate.clear_map();
		var city = (!this.id) ? Ultimate.first_city_in_list() : this.id;
		Ultimate.center_map_on(null,city);
		HousesPage.load_house_markers(city);
		HousesPage.load_house_table(city);
	},
	
	load_house_markers: function(city) {
		new Ajax.Request("/houses/cityfilter",{
			method: "post",
			parameters: {city: city},
			onSuccess: function(transport){
				transport.responseJSON.each(function(json){
					var address = json["address"];
					var city = json["city"];
					var zip = json["zip"];
					var full_address = address + " " + city + ", AZ " + zip;
					var marker_html = "<address>" + address + "<br \/>" + city + ", AZ " + zip + "<\/address>";
					marker_html += "<br \/><a href=\"/houses/" + json["id"] + "\">View Property</a>";
					if(json["photo"] !== ""){
						marker_html = "<img class='google-photo' src=" + json["photo"] + "\/><br \/>" + marker_html;
					}
					Ultimate.mark_on_map(full_address,marker_html);
				});
			},
			onFailure: function(transport){
				alert("Failed to get City Houses");
			}
		});		
	},
	
	load_house_table: function(city) {
		new Ajax.Updater({success:'houses-table'},
			'/houses/citylist',
			{
				evalScripts: false,
				parameters: {city: city},
				onComplete: SortableTable.find
			});		
	}
}

var HousePage = {
	load_map: function() {
		if(map && geocoder){
			// house_address is built on the views/houses/show view.
			var address = house_address["house"]["address"];
			var city = house_address["house"]["city"];
			var zip = house_address["house"]["zip"];
			var full_address = address + " " + city + ", AZ " + zip;
			Ultimate.center_map_on(address,city);
			var marker_html = "<address>" + address + "<br \/>" + city + ", AZ" + zip + "<\/address>";
			Ultimate.mark_on_map(full_address, marker_html);
		}		
	}
}

var CommercialPage = {
	load_map: function() {
		if(map && geocoder){
			var address = commercial_address["commercial"]["address"];
			var city = commercial_address["commercial"]["city"];
			var zip = commercial_address["commercial"]["zip"];
			var full_address = address + " " + city + ", AZ " + zip;
			Ultimate.center_map_on(address,city);
			Ultimate.mark_on_map(full_address, null);
		}
	}
}