var mapviewer;
var small_pan_zoom_widget;
var zoomLevel = 15;
var mapType = 4;
var mySquare;
var currentMapType;
var currentMarker = 15;
var dragMarker = true;

var logged_events = new Array();
var events_count = 0;

var homePostcodeField;
var altPostcodeField;
var homePostcodeChoice;
var altPostcodeChoice;
var latLongField;
var gridReferenceField;
var gridReferenceDisplay;


function loadMap() {
	//Called when the page is loaded.
	//Determines if we have either a grid reference or a postcode
	//Loads the map appropriately
	
	//var homePostcodeField = document.getElementById('ctlAddress_ctlAddressPAF_txtPostcode');
	//var altPostcodeField = document.getElementById('ctlSelectMap_txtAltPostcode');
	//var homePostcodeChoice = document.getElementById('ctlSelectMap_rblPostcodeChoice_0');
	//var altPostcodeChoice = document.getElementById('ctlSelectMap_rblPostcodeChoice_1');
	//var latLongField = document.getElementById('ctlSelectMap_txtLatLong');
	var postcode;
	var geoData;
	
	if (latLongField)
	{
		geoData = latLongField.value;
	} 
	
	if ((homePostcodeChoice) && (homePostcodeField)) {
		//previously used homePostcodeChoice.status but this doesn't work in Firefox
		if (homePostcodeChoice.checked)	 
		{
			postcode = homePostcodeField.value;
		}
	}
	
	if ((altPostcodeChoice) && (altPostcodeField)) {	
		//previously used altPostcodeChoice.status but this doesn't work in Firefox
		if (altPostcodeChoice.checked)	 
		{
			postcode = altPostcodeField.value;
		}
	}
	
	if (geoData)
	{
		loadMapFromLatLong(geoData);
	} else if (postcode) {
		loadMapFromPostcode(postcode);
	}	
	
}

function setPostcodeForMap() {
	var postcode;
	
	//previously used homePostcodeChoice.status but this doesn't work in Firefox
	if (homePostcodeChoice.checked)	 
	{
		postcode = homePostcodeField.value;
	}
	
	//previously used altPostcodeChoice.status but this doesn't work in Firefox
	if (altPostcodeChoice.checked)	 
	{
		postcode = altPostcodeField.value;
	}
	
	if (postcode)
	{
		loadMapFromPostcode(postcode);
	} else {
		alert("Please enter a postcode.");
	}
}


function getMapViewer() {
		mapviewer = new MultimapViewer(document.getElementById('mapviewer'), mapType);
}

function useOSPreference()
{
		// USE ORDNANCE SURVEY (COPYRIGHT 43513U)
		var prefs = MMDataResolver.getDataPreferences(MM_WORLD_MAP);
		//var osprefs = '';
		var osprefs = [];
		osprefs.push(841);
        osprefs.push(904);

		for( var i = 0; i < prefs.length; ++i ) {
			//var copyright = MMDataResolver.getCopyright(prefs[i], MM_WORLD_MAP);
			//if (copyright.indexOf ('43513U') != -1)
			//    osprefs =  prefs[i];
			if( prefs[i] != 841 && prefs[i] != 904 )
				osprefs.push(prefs[i]);
		}
		
		//prefs.unshift(osprefs);
    	//MMDataResolver.setDataPreferences(MM_WORLD_MAP, prefs);
		MMDataResolver.setDataPreferences(MM_WORLD_MAP, osprefs);
	    mapviewer.redrawMap();
}

function loadMapFromPostcode(postcode)
{
	if (postcode)
	{
		//alert(postcodeField.value);
		getMapViewer();
		
		mapviewer.addEventHandler( 'endGeocode', endGeocode );

		if (postcode.slice(0, 2).toUpperCase() == 'IM')
		{
			mapviewer.goToPosition( new MMLocation( new MMLatLon( 54.16700, -4.48210 ), zoomLevel ));
			createMarker();
		}
		else
		{
			mapviewer.goToPosition( new MMLocation( new MMAddress( { postal_code : postcode, country_code : 'GB'} ), zoomLevel ));
		}
		//mapviewer.removeAllOverlays();
		
		useOSPreference();

		//alert(mapviewer.getAvailableMapTypes());
		//alert(mapviewer.getMapType());
		mapviewer.setOption('units','km');
		//small_pan_zoom_widget = new MMSmallPanZoomWidget();
		//var mapTypes = new Array(4,8);
		//map_type_widget = new MMMapTypeWidget(mapTypes);
		//mapviewer.addWidget(map_type_widget);
	}

}

function loadMapFromLatLong(geoData)
{
	if (geoData)
	{
		//alert(geoData);
		var arrGeo = geoData.split(',');
		getMapViewer();
		
		mapviewer.goToPosition( new MMLatLon(arrGeo[0],arrGeo[1] ), 15 );
		createMarker();
		useOSPreference();
		
		mapviewer.setOption('units','km');
	}
}

function endGeocode() {
	createMarker();
}

function centreMarker()
{
    mapviewer.removeAllOverlays();
	createMarker()
}

function createMarker()
{
    var pos = mapviewer.getCurrentPosition();
    if (currentMarker == '16') {
    	var icon = new MMIcon('images/km_square_marker_z16.png');
		icon.iconSize = new MMDimensions( 362, 362 );
		icon.iconAnchor = new MMPoint( 181, 181 );
    } else {
    	var icon = new MMIcon('images/km_square_marker_z15.png');
		icon.iconSize = new MMDimensions( 179, 179 );
		icon.iconAnchor = new MMPoint( 90, 90 );
    }

	if (dragMarker)
	{
		mySquare = mapviewer.createMarker(pos, {'draggable' : true, 'inert' : true,  'label': 'Drag this square to where you want your WildSquare to be', 'icon' : icon});
	} else {
		mySquare = mapviewer.createMarker(pos, {'draggable' : false, 'inert' : true, 'icon' : icon});
	}

}

function toggleStuff()
{
	mapviewer.removeWidget(small_pan_zoom_widget);
	mapviewer.removeAllOverlays();
}

function getSquarePos()
{
	var squarePosition = mySquare.getPosition();
	//var squareField = document.getElementById('ctlSelectMap_txtGridReference');
	//var squareHiddenField = document.getElementById('ctlSelectMap_txtLatLong');

	//alert(squarePosition.coords);
	var SquareLatLong = squarePosition.coords.toString();
	//alert(SquareLatLong);
	SquareLatLong = SquareLatLong.replace(/\(/g,"");
	SquareLatLong = SquareLatLong.replace(/\)/g,"");
	//alert(SquareLatLong);
	var ArrSquareLatLong = SquareLatLong.split(',');
	//alert(ArrSquareLatLong[1]);

	var ll2 = new LatLng(ArrSquareLatLong[0],ArrSquareLatLong[1]);
	//alert("Latitude/Longitude: " + ll2.toString());
	var os2 = ll2.toOSRef();
	//alert("Converted to OS Grid Ref: " + os2.toString() + " - " + os2.toSixFigureString());

	gridReferenceField.value = os2.toSixFigureString();
	gridReferenceDisplay.innerHTML = os2.toSixFigureString();
	latLongField.value = SquareLatLong;
}

function doShowMapButton () {
	try {
		var mySixFigRef = gridReferenceField.value.toUpperCase();
		gridReferenceField.value = mySixFigRef;
		//alert("6FigRef: " + mySixFigRef.toString());
		var myOSRef = getOSRefFromSixFigureReference(mySixFigRef); 
		//alert("OSRef: " + myOSRef.toString());
		var myLatLng = myOSRef.toLatLng();
		//alert("LatLng: " + myLatLng.toString());	
		
		if (mapviewer) {mapviewer.removeAllOverlays();}
		loadMapFromLatLong(myLatLng.lat + "," + myLatLng.lng);
	}
	catch(err) {
		alert('Error in format of Wildsquare reference.  Should be e.g. NN123456 \n' )
	}
}

function zoom15() {
	mapviewer.setZoomFactor(15);
	mapviewer.goToPosition(mySquare.getPosition());
	currentMarker = '15';

	centreMarker();

}


function zoom16() {
	mapviewer.setZoomFactor(16);
	mapviewer.goToPosition(mySquare.getPosition());
	currentMarker = '16';

	centreMarker();
	
}

function logEvent( eventType, eventTarget, arg1, arg2, arg3 ) {
    // Log this event
    while( logged_events.length >= 5 ) {
	logged_events.shift();
    }
    ++events_count;
    var logstr = events_count+": "+eventType + " event from ";
    logstr += (eventTarget == mapviewer?'mapviewer':(eventTarget==marker?'marker':'infobox'));
    logstr += " with "+(arg1||arg2||arg3?"args ( "+arg1+(arg2?", "+arg2:"")+(arg3?", "+arg3:"")+" )":"no args")+"\n\n";
    logged_events.push( logstr );
    var fulltext = "";
    for( var i = 0; i < logged_events.length; ++i ) {
	fulltext += logged_events[i];
    }
    document.getElementById('logarea').value = fulltext;
    return true;
}

function confirmMap(geoData)
{
	//alert(geoData);
	dragMarker = false;
	
	loadMapFromLatLong(geoData);
	mapviewer.setOption('drag', '');
	//mapviewer.setDraggable(false);

	//mapDiv.style.height ="528px";
	//mapDiv.style.width = "650px";
}