function show_loading_panels() {
	var loading = document.getElementById("loading");
	loading.style.display = "block";

	var loading_results = document.getElementById("loading_results");
	if (loading_results) {
		loading_results.style.display = "block";
	}
}

function hide_loading_panels() {
	var loading = document.getElementById("loading");
	loading.style.display = "none";

	var loading_results = document.getElementById("loading_results");
	if (loading_results) {
		loading_results.style.display = "none";
	}
}

function init_map_controls(map, highlight, exclude, initial) {
	map.bf_overlays = {};
	types = ['lodging','attraction','restaurant','event','resource'];
	for (var i=0; i<types.length; i++) {
		var type = types[i];
		var control = document.getElementById('map_control_' + type);
		if (control) {
			control.checked = false;
			control.bf_type = type;
			var toggle_objects = function() { 
								// alert('toggle_objects[' + this.bf_type + ']');
								if (this.checked) { 
									map_objects(map, this.bf_type, highlight[this.bf_type], exclude[this.bf_type]); 
								}
								else { 
									hide_objects(map, this.bf_type); 
								}
							};
			YAHOO.util.Event.addListener(control, 'click', toggle_objects);
			// alert(type + ':' + initial[type]);
			if (initial[type]) { control.click(); }
		}
	}
}


function hide_objects(map, type) {
	show_loading_panels();
	if (type in map.bf_overlays) {
		overlays = map.bf_overlays[type];
		for (var i=0; i<overlays.length; i++) {
			var o = overlays[i];
			if (!o.never_hide) {
				map.removeOverlay(o);
			}
		}
	}
	else {
		// alert('type [' + type + '] has not yet been loaded!!');
	}
	hide_loading_panels();
}

function map_objects(map, type, highlight, exclude) {
	show_loading_panels();

	if (type in map.bf_overlays) {
		// alert('type [' + type + '] has already been loaded!!');
		overlays = map.bf_overlays[type];
		for (var i=0; i<overlays.length; i++) {
			var o = overlays[i];
			if (!o.never_hide) {
				map.addOverlay(o);
			}
		}
		hide_loading_panels();
	}
	else {
		type_overlays = new Array();
		map.bf_overlays[type] = type_overlays;
		var bounds = map.getBounds();
		var southWest = bounds.getSouthWest();
		var northEast = bounds.getNorthEast();
		var objectsUrl = '/' + type + '/service/map/?lat1=' + southWest.lat() + '&lat2=' + northEast.lat() + '&lng1=' + southWest.lng() + '&lng2=' + northEast.lng();
		document.getElementById('map_debug').innerHTML = "Loading data from [" + objectsUrl + "]";
	
		highlight = (highlight==null)? {} : highlight;
		exclude = (exclude==null)? {} : exclude;
	
		var callback = {
			success : function(o) {
				try {
				    var response = YAHOO.lang.JSON.parse(o.responseText);
				    full_results = response.mappable_objects;
				    for (var i=0; i<full_results.length; i++) {
				    	var item = full_results[i];
				    	if (!exclude[item.id]) {
				    		var overlay = createFidoMarker(item, type, highlight[item.id]);
				    		overlay.never_hide = highlight[item.id];
							type_overlays.push(overlay);
				    		map.addOverlay(overlay);
						}
				    }
					document.getElementById('map_debug').innerHTML = "Loaded [" + full_results.length + "] items";
				}
				catch (e) {
				    alert("Invalid map data! [" + e + "]");
					document.getElementById('map_debug').innerHTML = "Failed to load data (error code=102). Please try again later.";
					hide_loading_panels();
				}
				hide_loading_panels();
			},
			failure : function(o) {
				document.getElementById('map_debug').innerHTML = "Failed to load data (error code=101). Please try again later.";
				hide_loading_panels();
			},
			scope : this
		}		
		var conn = YAHOO.util.Connect.asyncRequest("GET", objectsUrl, callback);
	}
}

function createFidoMarker(item, type, highlight) {
	var icon = new GIcon();
	switch (type) {
		case 'attraction':
			icon.image = highlight ? "/site_media/images/icon_fido.gif" : "/site_media/images/icon_attraction.gif";
			icon.shadow = "/site_media/images/icon_hotel_shadow.png";
			break;
		case 'restaurant':
			icon.image = highlight ? "/site_media/images/icon_fido.gif" : "/site_media/images/icon_restaurant.gif";
			icon.shadow = "/site_media/images/icon_hotel_shadow.png";
			break;
		case 'event':
			icon.image = highlight ? "/site_media/images/icon_fido.gif" : "/site_media/images/icon_event.gif";
			icon.shadow = "/site_media/images/icon_hotel_shadow.png";
			break;
		case 'resource':
			icon.image = highlight ? "/site_media/images/icon_fido.gif" : "/site_media/images/icon_resource.gif";
			icon.shadow = "/site_media/images/icon_hotel_shadow.png";
			break;
		default:
			icon.image = highlight ? "/site_media/images/icon_fido.gif" : "/site_media/images/icon_hotel.gif";
			icon.shadow = "/site_media/images/icon_hotel_shadow.png";
	}
		
	icon.iconSize = new GSize(17, 20);
	icon.shadowSize = new GSize(28, 20);
	icon.iconAnchor = new GPoint(6, 20);
	icon.infoWindowAnchor = new GPoint(5, 1);
	var point = new GLatLng(item.latitude, item.longitude);
	var marker = new GMarker(point, { icon:icon } );

	switch (type) {
		case 'attraction':
		case 'restaurant':
		case 'event':
		case 'resource':
		default:
			GEvent.addListener(marker, "click", function() {
				var html = "<div class='mapInfo'>";
				if (item.image != '') { 
					html += "<img src='" + item.image + "'/><div class='details'>"; 
				}
				else {
					html += "<div class='details' style='width:100%'>";
				}
				html += "<h1><a href='/" + type + "/" + item.id + "'>" + item.name + "</a></h1>" + item.description + "</div></div>";
				marker.openInfoWindowHtml(html,{maxWidth:270});
			});
	}

	return marker;
}



function init_clusters(map, type, results_manager) {
	map_clusters(map, clusterZoom(map.getZoom(),type), type, results_manager);

	GEvent.addListener(map, "moveend", function() {
		map_clusters(map, clusterZoom(map.getZoom(),type), type, results_manager);
	});
}


function map_clusters(map, zoom_level, type, results_manager) {
	show_loading_panels();

	var results_container = document.getElementById('results_list');
	for (var i=0; i<results_container.childNodes.length; i++) {
		var node = results_container.childNodes[i];
		if (node.nodeName=='DIV') {
			node.style.display = "none";
		}
	}
	
	var bounds = map.getBounds();
	var southWest = bounds.getSouthWest();
	var northEast = bounds.getNorthEast();
	if (!type) { type = 'destination'; }
	var objectsUrl = '/cluster/destination/?lat1=' + southWest.lat() + '&lat2=' + northEast.lat() + '&lng1=' + southWest.lng() + '&lng2=' + northEast.lng();
	document.getElementById('map_debug').innerHTML = "Loading data from [" + objectsUrl + "]";

	if (!('items' in map)) {
		map.items = {};
		map.raw_results = [];
	}

	var callback = {
		success : function(o) {
			try {
			    var response = YAHOO.lang.JSON.parse(o.responseText);
				if (results_manager) {
					results_manager.load_results(response.items, results_container, '', null);
				}
				else {
					for (var i=0; i<response.items.length; i++) {
						var item = response.items[i];
						if (!(item.id in map.items)) {
							var snap = createCitySnap(item);
							results_container.appendChild(snap);
							map.items[item.id] = snap;
							map.raw_results.push(item);
						}
						map.items[item.id].style.display = "block";
					}
				}
				document.getElementById('map_debug').innerHTML += "Loaded [" + response.items.length + "] items.";
			}
			catch (e) {
			    alert("Invalid map data! [" + e + "]");
				document.getElementById('map_debug').innerHTML += "Failed to load data (error code=102). Please try again later.";
				hide_loading_panels();
			}
			hide_loading_panels();
		},
		failure : function(o) {
			document.getElementById('map_debug').innerHTML += "Failed to load data (error code=103). Please try again later.";
			hide_loading_panels();
		},
		scope : this
	}		
	var conn = YAHOO.util.Connect.asyncRequest("GET", objectsUrl, callback);
}


function createClusterMarker(cluster, type) {
	var icon = new GIcon();
	
	if (cluster.count >= 100) {
		icon.image = "/site_media/images/cluster100.png";
		icon.iconSize = new GSize(48, 48);
		icon.iconAnchor = new GPoint(24, 24);
		icon.infoWindowAnchor = new GPoint(24, 24);
		icon.zindex = 100;
	}
	else if (cluster.count >= 50) {
		icon.image = "/site_media/images/cluster50.png";
		icon.iconSize = new GSize(32, 32);
		icon.iconAnchor = new GPoint(16, 16);
		icon.infoWindowAnchor = new GPoint(16, 16);
		icon.zindex = 50;
	}
	else if (cluster.count >= 20) {
		icon.image = "/site_media/images/cluster20.png";
		icon.iconSize = new GSize(32, 32);
		icon.iconAnchor = new GPoint(16, 16);
		icon.infoWindowAnchor = new GPoint(16, 16);
		icon.zindex = 20;
	}
	else if (cluster.count >= 10) {
		icon.image = "/site_media/images/cluster10.png";
		icon.iconSize = new GSize(24, 24);
		icon.iconAnchor = new GPoint(12, 12);
		icon.infoWindowAnchor = new GPoint(12, 12);
		icon.zindex = 10;
	}
	else if (cluster.count >= 5) {
		icon.image = "/site_media/images/cluster5.png";
		icon.iconSize = new GSize(20, 20);
		icon.iconAnchor = new GPoint(10, 10);
		icon.infoWindowAnchor = new GPoint(10, 10);
		icon.zindex = 5;
	}
	else if (cluster.count >= 2) {
		icon.image = "/site_media/images/cluster" + cluster.count + ".png";
		icon.iconSize = new GSize(16, 16);
		icon.iconAnchor = new GPoint(8, 8);
		icon.infoWindowAnchor = new GPoint(8, 8);
		icon.zindex = 2;
	}
	else {
		icon.image = "/site_media/images/cluster1.png";
		icon.iconSize = new GSize(10, 10);
		icon.iconAnchor = new GPoint(5, 5);
		icon.infoWindowAnchor = new GPoint(5, 5);
		icon.zindex = 1;
	}

	var point = new GLatLng(cluster.latitude, cluster.longitude);
	var marker = new GMarker(point, { icon:icon, 
									  zIndexProcess:function(){ return icon.zindex; } } );

	GEvent.addListener(marker, "click", function() {
				var html = "<div class='clusterInfo' id='cluster" + cluster.id + "'>";
				for (var i=0; i<cluster.nodes.length; i++) {
					if (type=='hotel') {
						html += buildHotelLink(cluster.nodes[i]);
					}
					else {
						html += buildCityLink(cluster.nodes[i]);
					}
					if (i<cluster.nodes.length-1) {
						html += ", ";
					}
				}
				if (cluster.count>cluster.nodes.length) {
					html += " and " + (cluster.count-cluster.nodes.length) + " more";
				}
				html += "</div>";
				marker.openInfoWindowHtml(html,{maxWidth:270});
			});

	return marker;
}

function clusterZoom(mapZoom,type) {
	z = mapZoom - 1;
	if (z<0) {
		z=0;
	}
	else if (type=='hotel') {
		if (z>13) {
			z = 15;
		}
		else if (z>8) {
			z = z + 2;
		}
	}
	else if (z>10) {
		z = 10;
	}
	return z;
}


function buildCityLink(city) {
	var html = "<a href='/destination/city/" + city.slug + "/' target='_blank'>" + city.name + "</a>";
	return html;
}

function buildHotelLink(hotel) {
	var html = "<a href='/lodging/" + hotel.id + "/' target='_blank'>" + hotel.name + "</a>";
	return html;
}

function createCitySnap(city) {
	var snapshot = document.createElement('div');
	snapshot.id = 'city_' + city.id;
	snapshot.className = 'object_snapshot';
	snapshot.setAttribute('name',city.name);
	snapshot.setAttribute('popularity',city.popularity);
	
	var photo = document.createElement('div');
	photo.className = "photo";
	if (city.image != null && city.image != '') {
		photo.innerHTML = '<div class="photo_inner"><a href="/destination/city/' + city.slug + '/"><img src="' + city.image + '"/></a></div>';			
	}
	snapshot.appendChild(photo);

	var info = document.createElement('div');
	info.className = 'info';
	infoContents = '<h2><a href="/destination/city/' + city.slug + '/">' + city.name + '</a></h2>' + city.description;
	infoContents += '<div class="links"><a href="/destination/city/' + city.slug + '/">Overview</a> | ';
	infoContents += '<a href="/lodging/city/' + city.slug + '/">Hotels</a> | ';
	infoContents += '<a href="/attraction/city/' + city.slug + '/">Attractions</a> | ';
	infoContents += '<a href="/restaurant/city/' + city.slug + '/">Restaurants</a> | ';
	infoContents += '<a href="/resource/city/' + city.slug + '/">Services</a>';
	infoContents += '</div>';
	info.innerHTML = infoContents;
	snapshot.appendChild(info);

	var rate = document.createElement('div');
	rate.className = 'rate';
	rate.innerHTML = '<a href="/destination/city/' + city.slug + '/" class="button">LEARN MORE</a>';
	info.appendChild(rate);

	var bottom_edge = document.createElement('div');
	bottom_edge.className = "bottom_edge";
	snapshot.appendChild(bottom_edge);
	return snapshot;
}

