//getMarkerImgUrl: Returns the url for a marker bitmap image based on the category number given
function getMarkerImgUrl( category ) {
	var url;
	switch ( category ) {
	//GPSed locations have numbers 1 - 6
	case 1 : 
		url = 'mini_marker_red.png';
		break;
	case 2 : 
		url = 'mini_marker_orange.png';
		break;
	case 3 : 
		url = 'mini_marker_yellow.png';
		break;
	case 4 : 
		url = 'mini_marker_green.png';
		break;
	case 5 : 
		url = 'mini_marker_blue.png';
		break;
	case 6 :
		url = 'mini_marker_purple.png';
		break;
	//Non-GPSed locations have numbers 7 - 12
	case 7 :
		url = 'circle_marker_red.png';
		break;
	case 8 : 
		url = 'circle_marker_orange.png';
		break;
	case 9 : 
		url = 'circle_marker_yellow.png';
		break;
	case 10 : 
		url = 'circle_marker_green.png';
		break;
	case 11 : 
		url = 'circle_marker_blue.png';
		break;
	case 12 : 
		url = 'circle_marker_purple.png';
		break;
	//New sites have numbers 13 - 18
	case 13 : 
		url = 'new_marker_red.png';
		break;
	case 14 : 
		url = 'new_marker_orange.png';
		break;
	case 15 : 
		url = 'new_marker_yellow.png';
		break;
	case 16 : 
		url = 'new_marker_green.png';
		break;
	case 17 : 
		url = 'new_marker_blue.png';
		break;
	case 18 :
		url = 'new_marker_purple.png';
		break;
	default :
		url = 'mini_marker_red.png';
		break;
	}
	return 'img/' + url;
}

function formatSiteName(name) {
	//Create a formatted marker title which correctly displays accented characters in the pop-up hints on markers
	var formattedName = name;
	while (formattedName.indexOf("acute;") > 0) {
		formattedName = formattedName.replace("&amp;aacute;","\u00E1");
		formattedName = formattedName.replace("&amp;iacute;","\u00ED");
		formattedName = formattedName.replace("&amp;eacute;","\u00E9");
		formattedName = formattedName.replace("&amp;oacute;","\u00F3");
		formattedName = formattedName.replace("&amp;uacute;","\u00FA");
//		formattedName = formattedName.replace("&amp;","&");
	}
	while (formattedName.indexOf("ntilde;") > 0) {
		formattedName = formattedName.replace("&amp;ntilde;","\u00F1");
	}
	return formattedName;
}

function getMarkerType( num, len, dep, fix ) {
	//Determine marker colour
	var type = 1;
	//Determine type from length of site
	var siteLen = len + dep;
	if (siteLen >= 5000) {
		//Major cave
		type = 6;
	}
	else if (siteLen >= 1000) {
		//Significant cave
		type = 5;
	}
	else if (siteLen >= 250) {
		//Significant cave
		type = 4;
	}
	else if (siteLen >= 100) {
		//Significant cave
		type = 3;
	}
	else if (siteLen > 0) {
		//Short cave or shaft
		type = 2;
	}
	else {
		//Unexplored site
		type = 1;
	}

	//Identify new sites for year and sites beyond year
	var newSitesStart = 999999; //No new sites
	var sitesEnd = 999999; //All sites
	
	var start2011 = 3484; //First new site of 2011
	var start2010 = 3342; //First new site of 2010
	var start2009 = 3117; //etc.
	var start2008 = 2808;
	var start2007 = 2618;
	var start2006 = 2362;
	var start2005 = 2165;
	var start2004 = 1969;
	var start2003 = 1846;
	var start2002 = 1716;
	var start2001 = 1608;
	var start2000 = 1455;
	var start1999 = 1361;
	var start1998 = 1281;
	var start1997 = 1216;
	var start1996 = 1101;
	var start1995 = 1000;
	var start1994 = 965;
	var start1993 = 914;
	var start1992 = 891;
	var start1991 = 865;
	var start1990 = 802;

	if (year == 2010) {
		sitesEnd = start2011;
		newSitesStart = start2010;
	}
	else if (year == 2009) {
		sitesEnd = start2010;
		newSitesStart = start2009;
	}
	else if (year == 2008) {
		sitesEnd = start2009;
		newSitesStart = start2008;
	}
	else if (year == 2007) {
		sitesEnd = start2008;
		newSitesStart = start2007;
	}
	else if (year == 2006) {
		sitesEnd = start2007;
		newSitesStart = start2006;
	}
	else if (year == 2005) {
		sitesEnd = start2006;
		newSitesStart = start2005;
	}
	else if (year == 2004) {
		sitesEnd = start2005;
		newSitesStart = start2004;
	}
	else if (year == 2003) {
		sitesEnd = start2004;
		newSitesStart = start2003;
	}
	else if (year == 2002) {
		sitesEnd = start2003;
		newSitesStart = start2002;
	}
	else if (year == 2001) {
		sitesEnd = start2002;
		newSitesStart = start2001;
	}
	else if (year == 2000) {
		sitesEnd = start2001;
		newSitesStart = start2000;
	}
	else if (year == 1999) {
		sitesEnd = start2000;
		newSitesStart = start1999;
	}
	else if (year == 1998) {
		sitesEnd = start1999;
		newSitesStart = start1998;
	}
	else if (year == 1997) {
		sitesEnd = start1998;
		newSitesStart = start1997;
	}
	else if (year == 1996) {
		sitesEnd = start1997;
		newSitesStart = start1996;
	}
	else if (year == 1995) {
		sitesEnd = start1996;
		newSitesStart = start1995;
	}
	else if (year == 1994) {
		sitesEnd = start1995;
		newSitesStart = start1994;
	}
	else if (year == 1993) {
		sitesEnd = start1994;
		newSitesStart = start1993;
	}
	else if (year == 1992) {
		sitesEnd = start1993;
		newSitesStart = start1992;
	}
	else if (year == 1991) {
		sitesEnd = start1992;
		newSitesStart = start1991;
	}
	else if (year == 1990) {
		sitesEnd = start1991;
		newSitesStart = start1990;
	}
	else if (year < 1990) {
		sitesEnd = start1990;
		newSitesStart = start1990;
	}
	
	if ( num >= sitesEnd ) {
		type = -1;
	}
	else if ( num >= newSitesStart ) {
		type +=12;
	}
	//Update estimated locations
	else if (fix > 1) {
		type +=6;
	}
	return type;
}

//parseDataJSON: Creates data objects array from the sites data
function parseDataJSON( jsonData ) {
//	var startTime = new Date().getTime();

	var dataArr = eval( jsonData ); //Ext.util.JSON.decode( jsonData );

//	var endTime = new Date().getTime();
//	alert( 'Parsing JSON data took: ' + (endTime - startTime) + 'ms.' );

	//Return objects
	return dataArr;
}

//processData: Creates markers from the data array
function processData( data ) {
	var startTime = new Date().getTime();
	var total = data.length;

	//Function which creates the markers, called recursively until all markers are 
	//added. Allows progress dialog to repaint during timer idle time
	var f = function ( startAt ) {
		return function(){
			for(var j = 0; ( j < 500 ) && ( startAt + j < total ); j++) {
				//Set index of marker to process
				var i = startAt + j;
				//Determine type from length of site
				var siteLen = data[i].len + data[i].dep;
				var type = getMarkerType(data[i].num, data[i].len, data[i].dep, data[i].fix);
				//Create marker if not excluded by year setting
				if ( type != -1 ) {
					var fullDesc = formatSiteName(data[i].desc).replace('&lt;BR/&gt;','<br/>');
					fullDesc += '<br/>Length: ' + data[i].len + 'm<br/>Depth: ' + data[i].dep + 'm';

					//Create marker
					var marker = createNewMarker(
						data[i].lat,
						data[i].lng,
						data[i].name,
						fullDesc,
						data[i].num,
						type
					);
					addMarker(marker, type);
				}
			}
			i++; //Add one to index because next loop through the first index used will be i + 0

			//Call again recursively if markers left
			if ( i < total ) {
				var prog = i/total;
				updateProgress(prog, Math.round(100*prog)+'% completed');

				setTimeout(f(i), 10);
			}
			else {
				//All markers processed, so clean up and call show markers function
				var endTime = new Date().getTime();
			//	alert( 'Creating site markers took: ' + (endTime - startTime) + 'ms.' );

				//All markers now loaded, so assign to map
				showMarkers();
			}
		};
	};
	//Call function to trigger marker loading
	setTimeout(f(0), 10);
}


//fetchData
function fetchData ( filename, callbackSuccess, callbackFail, remotedata ) {
	//Initialise xmlhttp object for the browser type
	xmlhttp=null;
	if (window.XMLHttpRequest) {
		// code for all new browsers
		xmlhttp=new XMLHttpRequest();
	}
	else if (window.ActiveXObject) {
		// code for IE5 and IE6
		xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
	}
	
	//Attempt to request permission to load data via AJAX from remote site if required
	if ( remotedata ) {
		try {
			netscape.security.PrivilegeManager.enablePrivilege ("UniversalBrowserRead");
		} catch (e) {
			//Not supported by all browsers. Just continue if it failed.
		}
	}
	
	//Check that browser can use xmlhttp
	if (xmlhttp!=null) {
		//Browser is capable. Request document
		if (xmlhttp.overrideMimeType) {
			xmlhttp.overrideMimeType ('text / xml');
		}
		xmlhttp.onreadystatechange = callbackSuccess; //Set callback function
		try {
			xmlhttp.open("GET",filename,true);
			xmlhttp.send(null);
		}
		catch (ex) {
			//Fetch failed, call fail callback
			callbackFail();
		}
	}
	else {
		//Browser not compatible
		alert("Your browser does not support XMLHTTP. Data cannot be loaded.");
	}
}

//Callback function for xmlhttp request
function state_Change() {
	if (xmlhttp.readyState == 4) {
		// 4 = "loaded"
		if (xmlhttp.status == 200 || xmlhttp.status == 0 ) {
			//OK, Create site markers from data
			var data = parseDataJSON( xmlhttp.responseText );
			//Update status display
			updateProgress( 0, 'Creating site markers...' );
			//Create markers from loaded data
			processData( data );
		}
		else {
			alert("Problem retrieving sites data.");
		}
	}
}


