var infoTutor
var infoMarker
var options_style
 
var MAX_ZOOM = 14
 
function initializeTutorMap(boundToUK, options) {
    if (!options) options = {}
 
    if (GBrowserIsCompatible()) {
        var map = new GMap2(document.getElementById("map_canvas"));
        var bounds = mapBounds(boundToUK)
 
        var zoom = map.getBoundsZoomLevel(bounds)
        if (zoom > MAX_ZOOM) zoom = MAX_ZOOM;
 
        map.setCenter(bounds.getCenter(), zoom);
        
        options_style = options.style

        if (options_style == 'small') {
            // no controls
        } else {
            map.addControl(new GSmallMapControl());
        }

				var baseIcon = makeBaseIcon()
 
        $A(tutors).each(function(tutor) {
            var point = new GLatLng(tutor.lat, tutor.lng);   
            var icon = new GIcon(baseIcon);
 
            var letter = String.fromCharCode(tutor.letter.charCodeAt(0));
            icon.image = "/images/markers/marker" + letter + ".png";
 
            // Set up our GMarkerOptions object
            markerOptions = { icon:icon };
            var marker = new GMarker(point, markerOptions);
 						marker.letter = letter

            GEvent.addListener(marker, "click", function() {
              markerEvent(tutor,marker)
            });
            GEvent.addDomListener(document.getElementById("marker" + letter), "click", function() {
              markerEvent(tutor,marker)
            });

            map.addOverlay(marker);
        })
 
        GEvent.addListener(map.getInfoWindow(), "closeclick", function() {
            deselectTutorCard()
						deselectMarker()
        })
    }
}

function markerEvent(tutor,marker){
	deselectTutorCard()
  infoTutor = tutor
  deselectMarker()
  infoMarker = marker
  selectTutorCard(tutor,marker)
  selectMarker(marker)	
}
 
function openTutorInfoWindow(marker, card) {
    content = DOM.Builder.fromHTML(card.innerHTML.strip())
    $(content).down('img.marker').remove()
    marker.openInfoWindow(content);
}
 
function tutorCard(tutor) {
    return $('tutor' + tutor.id)
}

function tutorPin(letter){
	return $('marker' + letter)
}

function selectTutorCard(tutor,marker){
	var card = tutorCard(tutor)
  card.addClassName("selected")
  if (options_style != 'small') {
    openTutorInfoWindow(marker, card)
  }
}

function selectMarker(marker){
	marker.setImage("/images/markers/marker" + marker.letter + "_highlighted.png")
  tutorPin(marker.letter).src = "/images/markers/marker" + marker.letter + "_highlighted.png"
}
 
function deselectTutorCard() {
    if (infoTutor) {
        tutorCard(infoTutor).removeClassName("selected")
    }
}

function deselectMarker() {
    if (infoMarker) {
        infoMarker.setImage("/images/markers/marker" + infoMarker.letter + ".png")
        tutorPin(infoMarker.letter).src = "/images/markers/marker" + infoMarker.letter + ".png"
    }
}

function mapBounds(boundToUK) {
    var lats, lngs
 
  if(boundToUK == 1 || tutors.length == 0) {
    lats = [50, 56];
   lngs = [-6, 2];
  } else {
    lats = tutors.pluck("lat")
        lngs = tutors.pluck("lng")
  }
    var maxlat = Math.max.apply(null, lats)
    var maxlng = Math.max.apply(null, lngs)
    var minlat = Math.min.apply(null, lats)
    var minlng = Math.min.apply(null, lngs)
 
    /* Calculates how much space to leave around the pins*/
    var maxlatbuffer = (maxlat - minlat) * 0.2
    var maxlngbuffer = (maxlng - minlng) * 0.2
    var minlatbuffer = maxlatbuffer * 0.5 /* The pins take up more space above the point, so only a smaller buffer is needed at the bottom of the map*/
    var minlngbuffer = maxlngbuffer
    
    minlat = minlat - minlatbuffer
    minlng = minlng - minlngbuffer
    maxlat = maxlat + maxlatbuffer
    maxlng = maxlng + maxlngbuffer
    
    return new GLatLngBounds(new GLatLng(minlat, minlng), new GLatLng(maxlat, maxlng))
}
 
function initializeSimpleMap(lat, lng, options) {
    if (!options) options = {}
    center = new GLatLng(lat, lng)
    if (GBrowserIsCompatible()) {
        var map = new GMap2(document.getElementById(options.dom_id || "map_canvas"));
        map.setCenter(center, (options.zoom || 13));
        if (options.style == 'tutor') {
            map.addControl(new GSmallMapControl());
            var icon = makeBaseIcon()
            icon.image = "/images/markers/marker_highlighted.png";
            markerOptions = { icon:icon };
            map.addOverlay(new GMarker(center, markerOptions))
        } else {
            map.addControl(new GLargeMapControl());
            map.addControl(new GMapTypeControl());
        }
    }
}

function initializeHighlightedTutorMap(lat, lng, tutor_id, options) {
    if (!options) options = {}
    tutor_position = new GLatLng(lat, lng)
    if (GBrowserIsCompatible()) {
        var map = new GMap2(document.getElementById(options.dom_id || "map_canvas"));
        map.setCenter(new GLatLng(lat+0.03, lng+0.02), (options.zoom || 13));

		var label = new TLabel();
		label.id = 'mapinfo';
		label.anchorLatLng = tutor_position;
		label.anchorPoint = 'bottomLeft';
		label.markerOffset = new GSize (72, 0);
		label.content = $('tutor' + tutor_id).innerHTML.strip();

		map.addTLabel(label);
    }
}

function makeBaseIcon() {
    var baseIcon = new GIcon();
    baseIcon.shadow = "/images/markers/shadow.png";
    baseIcon.iconSize = new GSize(25, 36);
    baseIcon.shadowSize = new GSize(25, 36);
    baseIcon.iconAnchor = new GPoint(6, 31);
    baseIcon.infoWindowAnchor = new GPoint(18, 10);
    baseIcon.infoShadowAnchor = new GPoint(0, 25);
    return baseIcon
}
