var map;
var showtraffic = false;
var maptype = "map" 
var marker = [];
var markerSelected = [];
var markerNum = 0;
var localSearch = new GlocalSearch(); // Object for doing postcode searches
var totalMarkers = 0; // Flag to check if a marker has been added,  if not will perform add on click
var totalMarkersSelected = 0; // Flag to check if a marker has been added,  if not will perform add on click

var icon = new GIcon(G_DEFAULT_ICON);
icon.image = "http://www.lincsruraltouring.co.uk/images/google_icon.png";
icon.shadow = "http://www.lincsruraltouring.co.uk/images/google_shadow.png";
icon.iconSize = new GSize(36, 45);
icon.shadowSize = new GSize(56, 45);
icon.iconAnchor = new GPoint(17, 43);
icon.infoWindowAnchor = new GPoint(15, 15);
//icon.infoShadowAnchor = new GPoint(16, 14);

var iconSelected = new GIcon(G_DEFAULT_ICON);
iconSelected.image = "http://www.lincsruraltouring.co.uk/images/google_icon_selected.png";
iconSelected.shadow = "http://www.lincsruraltouring.co.uk/images/google_shadow.png";
iconSelected.iconSize = new GSize(36, 45);
iconSelected.shadowSize = new GSize(56, 45);
iconSelected.iconAnchor = new GPoint(17, 43);
iconSelected.infoWindowAnchor = new GPoint(15, 15);

function mapLoad() {
	if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("gMap"));

		map.addControl(new GLargeMapControl());
		map.addControl(new GScaleControl());
		map.addControl(new GOverviewMapControl(new GSize(115,115)));

		if (showtraffic == true) {
		    // Traffic extension, requires /js/extmaptypecontrol.js
		    map.addControl(new ExtMapTypeControl({ showTraffic: true, showTrafficKey: true }));
		}

		map.addMapType(G_PHYSICAL_MAP); // Add terrain map type

		if (maptype == "terrain") {
		    map.setMapType(G_PHYSICAL_MAP);
		} else {
		    map.setMapType(G_NORMAL_MAP);
		}
		
		var mapControl = new GHierarchicalMapTypeControl();
		mapControl.clearRelationships();
		mapControl.addRelationship(G_SATELLITE_MAP, G_HYBRID_MAP, "Labels", false);
		map.addControl(mapControl); // Add control after you've specified the relationships

		map.enableScrollWheelZoom();
		map.setCenter(new GLatLng(gLat, gLng), gZoom);
		GEvent.addListener(map, 'click', mapClick);

		// Removing unwanted Google parts
		var gDiv = document.getElementById("gMap");
		gDiv.childNodes[1].style.display = 'none'; // Hide Google logo
		gDiv.childNodes[2].style.display = 'none'; // Hide Terms of Use text
		gDiv.childNodes[4].style.left = '8px'; // Move map scale further left
	}
}

function mapClick(marker, point) {
	if (!marker) { // If marker isn't being clicked act on map
		if (totalMarkers == 0 && mapAdminUse) { // If no markers already exist and map in add create
			var point = new GLatLng(parseFloat(point.y), parseFloat(point.x));
			var marker = createMarker(point, "Marker Name", "This will display teaser information", "URL goes here", "telephone goes here", "Address goes here", "bedford", "pub");
			map.addOverlay(marker);
			document.getElementById("ctl00_Page_content_markerLat").value = point.y;
			document.getElementById("ctl00_Page_content_markerLon").value = point.x;
		}
	}
}

function putMarkerAtPoint(point) {
	marker = createMarker(point, "Marker Name", "This will display teaser information");
	map.addOverlay(marker);
	map.setCenter(point, 13);
	document.getElementById("ctl00_Page_content_markerLat").value = point.y;
	document.getElementById("ctl00_Page_content_markerLon").value = point.x;
}

function createMarker(point, name, html) {
    var newMarker;
    var markerNumScope = markerNum;
	var markerOptions = new Object();
	
	if (mapAdminUse) { // If admin use is set make draggable
		markerOptions.draggable = true;
		document.getElementById("ctl00_Page_content_markerButton").value = 'Move Marker';
	}
	
	markerOptions.title = name;
	markerOptions.icon = icon;

	if (totalMarkers > 0) {
	    //map.removeOverlay(marker[markerNum]);
	    //markerNum -= 1;
	    //markerNumScope -= 1;
	}
	newMarker = new GMarker(point, markerOptions);

	totalMarkers = totalMarkers + 1; // Track that a marker has been added so no new marker will be on map click

	var html = '<div class="gInfoWindow">' + html + '</div>';

	GEvent.addListener(newMarker, 'click', function() { newMarker.openInfoWindowHtml(html); });
	GEvent.addListener(newMarker, 'dragstart', function() { newMarker.closeInfoWindow(); });
	GEvent.addListener(newMarker, 'dragend', function() { markerDrop(newMarker); });
	GEvent.addListener(newMarker, 'mouseover', function() { markerSwitch(markerNumScope); });
	GEvent.addListener(newMarker, 'mouseout', function() { markerSwitch(markerNumScope); });
	GEvent.addListener(newMarker, 'infowindowclose', function() { });
	
	return newMarker;
}

function createMarker_selected(point, name, html) {
    var newMarker;
    var markerNumScope = markerNum;
    var markerOptions = new Object();

    if (mapAdminUse) { // If admin use is set make draggable
        markerOptions.draggable = true;
        document.getElementById("ctl00_Page_content_markerButton").value = 'Move Marker';
    }

    markerOptions.title = name;
    markerOptions.icon = iconSelected;

    if (totalMarkersSelected > 0) {
        //map.removeOverlay(markerSelected[markerNum]);
        //markerNum -= 1;
        //markerNumScope -= 1;
    }
    newMarker = new GMarker(point, markerOptions);

    totalMarkersSelected = totalMarkersSelected + 1; // Track that a marker has been added so no new marker will be on map click

    var html = '<div class="gInfoWindow">' + html + '</div>';

    GEvent.addListener(newMarker, 'click', function() { newMarker.openInfoWindowHtml(html); markerSwitch(markerNumScope); });
    GEvent.addListener(newMarker, 'dragstart', function() { newMarker.closeInfoWindow(); });
    GEvent.addListener(newMarker, 'dragend', function() { markerDrop(newMarker); });
    GEvent.addListener(newMarker, 'mouseover', function() { markerSwitch(markerNumScope); });
    GEvent.addListener(newMarker, 'mouseout', function() { markerSwitch(markerNumScope); });
    GEvent.addListener(newMarker, 'infowindowclose', function() { markerSwitch(markerNumScope); });

    return newMarker;
}

function markerSwitch(markerNumber) {
    if (marker[markerNumber].isHidden()) {
        marker[markerNumber].show();
        markerSelected[markerNumber].hide();
    } else {
        marker[markerNumber].hide();
        markerSelected[markerNumber].show();
    }
}

function usePointFromPostcode(postcode, callbackFunction) {
	if (postcode != "") {
		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);
					callbackFunction(point);
				} else {
					alert("Postcode not found!");
				}
			});
		localSearch.execute(postcode + ", UK");
	}
}

function markerDrop(marker) {
    var point = new GLatLng(marker[markerNum].getPoint().lat(), marker[markerNum].getPoint().lng());
	document.getElementById("ctl00_Page_content_markerLat").value = point.y;
	document.getElementById("ctl00_Page_content_markerLon").value = point.x;
}

function setCenterToPoint(point) {
	map.setCenter(point, 13);
}

function centreMapToMarker() {
    var point = new GLatLng(marker[markerNum].getPoint().lat(), marker[markerNum].getPoint().lng());
	map.setCenter(point, gZoom);
}

window.addEvent('domready', function() {
    mapLoad();
});

// Stop form submit on postcode search
function testForEnter() {
    if (window.event.keyCode == 13) {
        window.event.cancelBubble = true;
        window.event.returnValue = false;
    }
}
