var map;
var name_filter;
var admin = false;
var fixed = false;
var pano = false;
var geocoder;
var admin_url = "";
var main_url = "";
var marker;
var gmarkers = [];
var mgr;
var lock_1 = false;
var features = {};
var icons = [];
var tooltip;
var panorama;
var timer;
var currentYaw = 180;

var property_icon = new GIcon();
property_icon.image = "http://maps.google.com/mapfiles/kml/pal5/icon12.png";
property_icon.shadow = "http://maps.google.com/mapfiles/kml/pal5/icon12s.png";
property_icon.iconSize = new GSize(32,32);
property_icon.shadowSize = new GSize(56,32);
property_icon.iconAnchor = new GPoint(23,26);
property_icon.infoWindowAnchor = new GPoint(23,4);

function create_stview(point)
{
	panorama = new GStreetviewPanorama(document.getElementById("pano"));
	GEvent.addListener(panorama, "error", function(e) {
			if (e == 600)
			{
				document.getElementById("pano").style.display = 'none';
				window.clearInterval(timer);
			}
		});
	panorama.setLocationAndPOV(point, {yaw: currentYaw, pitch: 0, zoom: 0});
	timer = window.setInterval(stview_spiral, 200);
	setTimeout(stview_kill, 5000);
}

function stview_kill()
{
	GEvent.addListener(panorama, "yawchanged", function(e)
		{
			if (e != currentYaw)
				window.clearInterval(timer);
		});
}

function stview_spiral()
{
	currentYaw += 2;
	panorama.panTo({yaw:currentYaw, pitch:0});
}

function create_map()
{
	if (GBrowserIsCompatible())
	{
		map = new GMap2(document.getElementById("map"));
		map.setCenter(new GLatLng(-26.20, 152.66), 12);
		mgr = new MarkerManager(map);
		if (fixed)
		{
			map.disableDragging();
			map.disableDoubleClickZoom();
			map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
			marker_list();
			return;
		}

		map.enableContinuousZoom();
		map.enableDragging();
		map.enableDoubleClickZoom();
		map.enableScrollWheelZoom();
		if (admin) {
			geocoder = new GClientGeocoder();
			var lat = document.getElementById('lat').value;
			var lng = document.getElementById('lng').value;
			if (lat != 0 && lng != 0)
			{
				update_suburbs();
				geocode_property();
			}
		} else {
			map.addControl(new GLargeMapControl());
			map.addControl(new GMapTypeControl());
			map.addControl(new google.maps.LocalSearch(), new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(10,20)));
			var point = new GLatLng(latitude, longitude);
			map.setCenter(point, 17);
			marker = new GMarker(point, {draggable: false, icon: property_icon});
			map.addOverlay(marker);
		}
	}
}

function list_possibilities()
{
	if (admin || lock_1)
		return;
	lock_1 = true;
	var field = name_filter || '';
	var bounds = map.getBounds();
	var sw = bounds.getSouthWest();
	var ne = bounds.getNorthEast();
	document.search_form.sw_lat.value = sw.lat();
	document.search_form.sw_lng.value = sw.lng();
	document.search_form.ne_lat.value = ne.lat();
	document.search_form.ne_lng.value = ne.lng();
	document.search_form.z.value = map.getZoom();
	var ll = new Hash();
	ll.set('sw_latitude', sw.lat());
	ll.set('sw_longitude', sw.lng());
	ll.set('ne_latitude', ne.lat());
	ll.set('ne_longitude', ne.lng());
	ll.set('zoom', map.getZoom());
	ll.set('name', field);
	new Ajax.Request(main_url + 'ajax/list_possibilities', {method: 'post', parameters: ll});
}

function add_possibilities(data)
{
	lock_1 = false;
	var i = 0;
	var options = document.getElementById('options');
	while (options.childNodes.length >= 1)
	{
		options.removeChild(options.firstChild);
	}
	var list = document.createElement("UL");
	for (i = 0; i < data.length; i++)
	{
		var item = document.createElement("LI");
		var link = document.createElement("A");
		link.href = "#";
		link.woeid = data[i].woeid;
		link.onclick = function () {
			zoom_to_id(this.woeid);
			return false;
			};
		var text = data[i].name;
		if (data[i].postcode > 0)
			text += ", " + data[i].postcode;

			text += ", " + data[i].state;
		link.appendChild(document.createTextNode(text));
		item.appendChild(link);
		list.appendChild(item);
	}
	options.appendChild(list);
	if (lock_1)
	{
		lock_1 = false;
		list_possibilities();
	}
}

function add_features(data)
{
	var m = [];

	if (document.getElementById("tooltip") == undefined)
	{
		tooltip = document.createElement("div");
		document.getElementById("map").appendChild(tooltip);
		tooltip.style.visibility="hidden";
		tooltip.id = 'tooltip';
		tooltip.style.background = '#fff';
		tooltip.style.border = '1px #000 solid';
		tooltip.style.padding = '2px';
	}

	for (i = 0; i < data.length; i++)
	{
		if (features[data[i].id] == undefined)
		{
			var ma = new GMarker(
				new GLatLng(data[i].lat, data[i].lng),
				{ icon: icons[data[i].icon] }
				);
			ma.tooltip = '<div class="tooltip">' + data[i].name + "<br><i>" + icons[data[i].icon].type_name + "</i>" + '</div>';
			GEvent.addListener(ma, "mouseover", function() {
				tooltip.innerHTML = this.tooltip;
				var point=map.getCurrentMapType().getProjection().fromLatLngToPixel(map.getBounds().getSouthWest(),map.getZoom());
				var offset=map.getCurrentMapType().getProjection().fromLatLngToPixel(this.getPoint(),map.getZoom());
				var anchor=this.getIcon().iconAnchor;
				var width=this.getIcon().iconSize.width;
				var pos = new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(offset.x - point.x - anchor.x + width,- offset.y + point.y +anchor.y));
				pos.apply(tooltip);
				tooltip.style.visibility="visible";
				});
			GEvent.addListener(ma, "mouseout", function() {
				tooltip.style.visibility="hidden";
				});
			m.push(ma);
			features[data[i].id] = true;
		}
	}
	mgr.addMarkers(m, 10);
	mgr.refresh();
}

function load_icons(data)
{
	var template = new GIcon();
	template.iconSize = new GSize(32,32);
	template.iconAnchor = new GPoint(16,16);
	template.infoWindowAnchor = new GPoint(16,0);

	for (i = 0; i < data.length; i++)
	{
		var icon = new GIcon(template);
		icon.image = "http://www.apartmentsqueensland.com.au/assets/image/icons/" + data[i].icon + ".png";
		icon.type_name = data[i].name;
		icons[data[i].id] = icon;
	}
}

function zoom_to_id(id)
{
	var post = new Hash();
	post.set('id', id);
	name_filter = '';
	document.getElementById('suggestion_box').value = '';
	new Ajax.Request(main_url + 'ajax/zoom_to_id', {method: 'post', parameters: post});
}

function update_suburbs()
{
	var postcode = document.getElementById('sel_postcode');
	if (postcode.value.length == 4)
		new Ajax.Request(main_url + "ajax/suburbs/" + postcode.value);
}

function geocode_property()
{
	var address = document.getElementById('address').value;
	var s = document.getElementById('suburb');
	if (s.selectedIndex == -1)
	{
		var suburb = '';
		var suburbid = original_suburb;
	} else {
		var suburb = s.options[s.selectedIndex].text;
		var suburbid = s.options[s.selectedIndex].value;
	}
	var p = document.getElementById('sel_postcode');
	var postcode = p.value;
	var postcodeid = p.value;
	var lookup = address + ', ' + suburb + ', ' + postcode + ', Australia';
	geocoder.getLatLng(
		lookup,
		function(point)
		{
			if (!point)
			{
				alert(lookup + " not found. Please double check the address");
			} else {
				if (marker != undefined)
					marker.hide();
				marker = new GMarker(point, {draggable: true, icon: property_icon});
				GEvent.addListener(marker, "dragstart", function() {
					map.closeInfoWindow();
				});
				GEvent.addListener(marker, "dragend", function() {
					geocode_property_popup(address, suburbid, postcodeid);
				});
				map.addOverlay(marker);
				map.setCenter(point, 17);
				geocode_property_popup(address, suburbid, postcodeid);
			}
		}
	);
}

function geocode_property_popup(address, suburb, postcode)
{
	var gps = marker.getLatLng();
	var ll = new Hash();
	ll.set('lat', gps.lat());
	ll.set('lng', gps.lng());
	ll.set('address', address);
	ll.set('suburb', (suburb == 0) ? original_suburb : suburb);
	ll.set('postcode', postcode);
	new Ajax.Request(main_url + 'ajax/edit_property', {method: 'post', parameters: ll});
}

function create_marker(lat, lng, id)
{
	var letter = String.fromCharCode("A".charCodeAt(0) + (gmarkers.length));
	var myIcon = new GIcon(G_DEFAULT_ICON, "http://www.google.com/mapfiles/marker" + letter + ".png");
	myIcon.printImage = "http://maps.google.com/mapfiles/marker"+letter+"ie.gif"
	myIcon.mozPrintImage = "http://maps.google.com/mapfiles/marker"+letter+"ff.gif"

	var marker = new GMarker(new GLatLng(lat, lng), {icon:myIcon});
	gmarkers.push(marker);
	map.addOverlay(marker);

	return letter;
}