var map_open_width = "654px";
var results_open_width = "198px";

var map;
var geocoder;
var groups = new Array();
var localSearch;

var typeFilter = -1;
var dayFilter = -1;

//create pin icon for users location
var blueIcon = new GIcon();
blueIcon.image = "http://maps.google.com/mapfiles/ms/icons/blue-pushpin.png";
blueIcon.shadow = "http://maps.google.com/mapfiles/ms/icons/msmarker.shadow.png";
blueIcon.iconSize=new GSize(32,32);
blueIcon.shadowSize=new GSize(56,32);
blueIcon.iconAnchor=new GPoint(10,32);
blueIcon.infoWindowAnchor=new GPoint(16,0);
var userMarker = new GMarker(new GPoint(0,0), {icon:blueIcon})

function createMap(){
  if (GBrowserIsCompatible()) {
	// Set up and configure map
	map = new GMap2(document.getElementById("map"));
	map.setCenter(new GLatLng(51.500755,-0.139861), 13);
	map.addControl(new GLargeMapControl());
	map.addControl(new GMapTypeControl());
	map.enableScrollWheelZoom();
	
	map.addOverlay(userMarker);
	userMarker.hide();
	
	GEvent.addListener(map,"click",clickHandler);
	
	localSearch = new GlocalSearch();
	
	// Set up geocoder
	//geocoder = new GClientGeocoder();
	//geocoder.setBaseCountryCode("uk");
	//geocoder.setViewport(new GLatLngBounds(new GLatLng(51.428958,-0.299194), new GLatLng(51.61335,0.092146)) );
  }
}

function searchMap(address){
	openResultPanel();
	var results = document.getElementById('results');
	results.innerHTML = "Searching...";
	
	//geocoder.getLatLng(address + ", London", listResults);
	
	localSearch.setSearchCompleteCallback(null,
    function() {
      
      if (localSearch.results[0]) {    
        var resultLat = localSearch.results[0].lat;
        var resultLng = localSearch.results[0].lng;
        var point = new GLatLng(resultLat,resultLng);
        listResults(point);
      }else{
        alert("Address not found!");
      }
    });  
    
  localSearch.execute(address + ", London, UK");
	
}

function listResults(point){
	if (!point) {
		alert("Address not found");
	} else {
		map.panTo(point, 13);
		userMarker.setLatLng(point);
		userMarker.show();
		
		// calculate group distances
		for(var group in groups){
			var distance = point.distanceFrom(groups[group].getLatLng());
			groups[group].dist = distance/1.609344;
		}
		// sort groups based on distance
		groups.sort(sortByDistance);
		
		updateResultsList()
		
	}
}

function sortByDistance(a,b){
	return (a.dist-b.dist);
}

function showGroup(id){
	var group = groups[id];
	map.panTo(group.getLatLng());
	group.openInfoWindowHtml(group.infoHtml);
	
	selectLeadersToEmail(group.group_id)
}

function clickHandler(overlay,latLng){
	if(overlay && overlay.group_id != undefined){
		//alert(overlay.group_id);
		selectLeadersToEmail(overlay.group_id)
	}
}

function selectLeadersToEmail(id){
	var clg_leaders = document.getElementById('clg_leaders');
	var group_options = clg_leaders.options;
	for(var i=0; i<group_options.length; i++){
		if(group_options[i].id == id){
			clg_leaders.selectedIndex = i;
		}
	}
}

function toggleResultPanel(){
	var results = document.getElementById("results");
	
	if(results.style.width == results_open_width){
		closeResultPanel();
	}else{
		openResultPanel();
	}
}
function openResultPanel(){
	var results = document.getElementById("results");
	var map_div = document.getElementById("map");
	var resultswitch = document.getElementById("resultswitch");
	results.style.width = results_open_width;
	map_div.style.width = map_open_width;
	resultswitch.innerHTML = "&lt;";
	map.checkResize();
}
function closeResultPanel(){
	var results = document.getElementById("results");
	var map_div = document.getElementById("map");
	var resultswitch = document.getElementById("resultswitch");
	results.style.width = "0";
	map_div.style.width = null;
	resultswitch.innerHTML = "&gt;";
	map.checkResize();
}

function filterType(type){
	typeFilter = type;
	updateResultsList();
}

function filterDay(day){
	dayFilter = day;
	updateResultsList();
}

Number.prototype.toDecimals=function(n){
    n=(isNaN(n))?
        2:
        n;
    var
        nT=Math.pow(10,n);
    function pad(s){
            s=s||'.';
            return (s.length>n)?
                s:
                pad(s+'0');
    }
    return (isNaN(this))?
        this:
        (new String(
            Math.round(this*nT)/nT
        )).replace(/(\.\d*)?$/,pad);
}

function updateResultsList(){
	var numGroups = 0;
	for(var group in groups){
		if((dayFilter == -1  || groups[group].day == dayFilter) &&
		   (typeFilter == -1 || groups[group].type == typeFilter)
		  ){
				groups[group].show();
				numGroups++;
		}else{
			groups[group].closeInfoWindow();
			groups[group].hide();
		}
	}
	
	var results = document.getElementById('results');

	if(numGroups > 0){
		results.innerHTML = "";
		for(var group in groups){
			if(!groups[group].isHidden()){
				var dist_text = Math.round(groups[group].dist/100)/10;
				var dist_text = dist_text.toDecimals(1);
				var result_text = "<div class='result'><a href=\"javascript:showGroup("+group+")\">"+groups[group].group_name+"</a> <i>("+groups[group].type_name+")</i><br/>"+groups[group].getTitle();
				if(!isNaN(dist_text)){ result_text += "&nbsp;<span class='distance'>"+dist_text+" miles</span>";}
				result_text += "</div>";
				results.innerHTML += result_text;
			}
		}	
	}else{
		results.innerHTML = "<div class=\"noresults\">There are no groups available with those requirements, please select different filters.</div>";
	}
}
