var map;
var geocoder;
var moveListener;

var onLoadCallBacks = new Array();

function load() {
  if (GBrowserIsCompatible()) {
    geocoder = new GClientGeocoder();
    map = new GMap2(document.getElementById('map'));
	
	
	
    map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl());
    
    moveListener = GEvent.addListener(map, "moveend", function() {
		searchLocationsNear(this.getCenter(), false);
	});
	
    //map.setCenter(new GLatLng(54.5, -2.5), 5);   25, 34
    centerSet(new GLatLng(51.5, -0.1), 9);
	
	for(var i = 0; i<onLoadCallBacks.length; i++) {
		onLoadCallBacks[i]();
	}
	
  }
}


function centerSet(center, zoom) {
	GEvent.removeListener(moveListener);
	map.setCenter(center, zoom);
	moveListener = GEvent.addListener(map, "moveend", function() {
		searchLocationsNear(this.getCenter());
	});
}

	
function searchLocations() {
	var address = document.getElementById('addressInput').value;
	geocoder.getLatLng(address+',UK', function(latlng) {
		if (!latlng) {
			alert(address + ' not found');
		} else {
			searchLocationsNear(latlng, true);
		}
	});
}

function searchLocationsNear(center, recenter) {
	var radius = document.getElementById('radiusSelect').value;
	var searchUrl = '/gateway/ajaxGateway.php?mode=locator&_module=maps&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 = 'No results found.';
			//map.setCenter(new GLatLng(54.5, -2.5), 5);
			//centerSet(new GLatLng(54.5, -2.5), 5);
			return;
		}
		
		var bounds = new GLatLngBounds();
		for (var i = 0; i < markers.length; i++) {
			var name = markers[i].getAttribute('name');
			var address = markers[i].getAttribute('address_1')+', ';
			if(markers[i].getAttribute('address_2') != ''){
				address += markers[i].getAttribute('address_2')+', ';
			}
			
			
			address += markers[i].getAttribute('town')+', ';
			address += markers[i].getAttribute('county')+', ';
			address += markers[i].getAttribute('postcode');
			address += "<br />"+markers[i].getAttribute('phone');
			var distance = parseFloat(markers[i].getAttribute('distance'));
			var point = new GLatLng(parseFloat(markers[i].getAttribute('lat')),
			parseFloat(markers[i].getAttribute('lng')));
			
			var marker = createMarker(point, name, address);
			map.addOverlay(marker);
			var classes = new Array();
			
			for (var g = 0; g < mGroups.length; g++) {
				if( markers[i].getAttribute(mGroups[g]) == 1 ){ 	
			
					classes.push(mGroups[g]);
					markerGroups[ mGroups[g] ].push(marker);
				}
			}
			markerGroups['all'].push(marker);
			
			var sidebarEntry = createSidebarEntry(marker, name, address, distance, classes);
			sidebar.appendChild(sidebarEntry);
			bounds.extend(point);
		}
		//map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
		if(recenter) {
			centerSet(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
		}
		showOnlyGroup(getRadioValue());
	});
}

function createMarker(point, name, address) {
	var marker = new GMarker(point);
	var html = '<b>' + name + '</b> <br/>' + address;
	GEvent.addListener(marker, 'click', function() {
		//GEvent.removeListener(moveListener);
		marker.openInfoWindowHtml(html);
		//moveListener = GEvent.addListener(map, "moveend", function() {
		//	searchLocationsNear(this.getCenter());
		//});
		centerSet(this.getPoint(), false);
	});
	return marker;
}

function addPoint(lat, long, name, address) {
	var point = new GLatLng(parseFloat(lat),
	                     parseFloat(long));
	
	var marker = createMarker(point, name, address);
	map.addOverlay(marker);
}

function showOnlyGroup(type){
	//console.log(type);
	if(type=="all"){
		/*
		for (x in markerGroups){
			toggleGroup(x,"show");
		}
		*/
		toggleGroup('all', "show");
		
		$('sidebar').getElements('.side').setStyle('display', 'block');
	
	}else{
		$('sidebar').getElements('.side').setStyle('display', 'none');
		/*
		for (x in markerGroups){
			toggleGroup(x,"hide");
		}
		*/
		toggleGroup('all', "hide");
		toggleGroup(type,"show");
		$('sidebar').getElements('.'+type).setStyle('display', 'block');
	
	}
}


function toggleGroup(type,state) {
	for (var i = 0; i < markerGroups[type].length; i++) {
		var marker = markerGroups[type][i];
		if (state == "show") {
			marker.show();
		} else {
			marker.hide();
		}
	} 
}


function createSidebarEntry(marker, name, address, distance, classes) {
	var div = document.createElement('div');
	var html = '<b>' + name + '</b> (' + distance.toFixed(1) + ')<br/>' + address;
	div.innerHTML = html;
	
	var sidebarClasses = 'side ';
	//console.log(classes);
	for(x =0; x < classes.length; x++) {
		sidebarClasses += classes[x]+' ';
	}
	sidebarClasses =  sidebarClasses.replace(/^\s+|\s+$/g, '') ;
	div.className = sidebarClasses;
	
	div.style.cursor = 'pointer';
	div.style.marginBottom = '5px'; 
	GEvent.addDomListener(div, 'click', function() {
		GEvent.trigger(marker, 'click');
	});
	GEvent.addDomListener(div, 'mouseover', function() {
		div.style.backgroundColor = '#eee';
	});
	GEvent.addDomListener(div, 'mouseout', function() {
		div.style.backgroundColor = '#fff';
	});
	return div;
}


function getRadioValue(){
	for(var i=0; i < document.locationSearch.showhide.length; i++) {
		if(document.locationSearch.showhide[i].checked) {
			return document.locationSearch.showhide[i].value;
		}
	}
}


