    //<![CDATA[
        
	var latitude = 0;
	var longitude = 0;
	var zoom = 0;

    var map = new GMap2(document.getElementById("map"));
    map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl());
	map.enableScrollWheelZoom();



	GEvent.addListener(map, "moveend", function() {
    var center = map.getCenter();
	});


	function recenter(latitude, longitude, zoom) {
	    map.setCenter(new GLatLng(latitude, longitude), zoom);
	}


    function resetMapPosition() {
	switch(uriq) {
	case "region=au":
	    map.setCenter(new GLatLng(-25.482951,154.863281), 3);
		pagelink = '<a href="'+document.URL+'">Triathlons in Oceania</a>';
		document.title = "TRImapper.com - Oceania Challenge Series Races, Challenge Triathlon Races in Oceania";
		break;
	case "region=eu":
	    map.setCenter(new GLatLng(50.792047,10.634765), 4);
		pagelink = '<a href="'+document.URL+'">Triathlons in Europe</a>';
		document.title = "TRImapper.com - Europe Challenge Series Races, Challenge Triathlon Races in Europe";
		break;
	case "cntry=au":
	    map.setCenter(new GLatLng(47.635783,13.403320), 6);
		pagelink = '<a href="'+document.URL+'">Triathlons in Austria</a>';
		document.title = "TRImapper.com - Austria Challenge Series Race(s), Challenge Triathlon Races in Austria";
		break;
	case "cntry=da":
	    map.setCenter(new GLatLng(56.096555,9.558105), 6);
		pagelink = '<a href="'+document.URL+'">Triathlons in Denmark</a>';
		document.title = "TRImapper.com - Denmark Challenge Series Race(s), Challenge Triathlon Races in Denmark";
		break;
	case "cntry=fr":
	    map.setCenter(new GLatLng(46.134170,2.548828), 5);
		pagelink = '<a href="'+document.URL+'">Triathlons in Austria</a>';
		document.title = "TRImapper.com - France Challenge Series Race(s), Challenge Triathlon Races in France";
		break;
	case "cntry=gm":
	    map.setCenter(new GLatLng(51.013754,9.997558), 6);
		pagelink = '<a href="'+document.URL+'">Triathlons in Germany</a>';
		document.title = "TRImapper.com - Germany Challenge Series Race(s), Challenge Triathlon Races in Germany";
		break;
	case "cntry=sp":
	    map.setCenter(new GLatLng(39.027718,-4.614257), 5);
		pagelink = '<a href="'+document.URL+'">Triathlons in Spain</a>';
		document.title = "TRImapper.com - Spain Challenge Series Race(s), Challenge Triathlon Races in Spain";
		break;
	case "cntry=nz":
	    map.setCenter(new GLatLng(-41.343824,173.979492), 5);
		pagelink = '<a href="'+document.URL+'">Triathlons in United Kingdom</a>';
		document.title = "TRImapper.com - New Zealand Challenge Series Race(s), Challenge Triathlon Races in New Zealand";
		break;
	default:
	    map.setCenter(new GLatLng(0,0), 1);
		pagelink = '<a href="'+document.URL+'">Triathlons in North America</a>';
		break;
	}
    }
    resetMapPosition();

    var baseIcon = new GIcon();
    baseIcon.iconSize = new GSize(16,27);
    baseIcon.iconAnchor = new GPoint(8, 20);
    baseIcon.infoWindowAnchor = new GPoint(8,8);

    var info = document.getElementById("sc4");

    // TODO - maybe make this one array of objects?
    var markerArray = new Array();
    var markerTitles = new Array();
    var markerPointsArray = new Array();
    var markerCallbacks = new Array();
    var markerTagStrings = new Array();
    var markerAddresses = new Array();
    var markerCityZips = new Array();
    var markersShown = new Array();
    var markerLength = 0;
    var tagToCountTable = {};

    function addTagToList(newTag) {
		if (tagToCountTable[newTag]) {
			tagToCountTable[newTag]++;
        } else {
            tagToCountTable[newTag] = 1;
        }
    }

    function sortByCount(a, b) {
        return tagToCountTable[b] - tagToCountTable[a];
    }

    function myEncodeURI(source) {
        // Do the javascript thing, but encode a space as a +
        var nextSpace = source.indexOf(' ');
        while (nextSpace != -1) {
            source = source.substring(0, nextSpace) + "+" + source.substring(nextSpace+1);
            nextSpace = source.indexOf(' ');
        }
        return encodeURI(source);
    }

	function zoomIN(cord1,cord2){
//	alert("cord1:"+cord1+" cord2:"+cord2);
		map.centerAndZoom(new GPoint(cord2, cord1), 16);
	}

    function createMarker(point, caption, index, markerColor) {

// new code to change the marker color
		var icon = new GIcon(baseIcon);
		icon.image = "http://www.trimapper.com/images/smmarker_" + markerColor + ".png";
		var marker = new GMarker(point, icon);
		
        // Show this marker's index in the info window when it is clicked
        GEvent.addListener(marker, "click", function() {
                marker.openInfoWindowHtml(caption);
		});
				

        markerCallbacks[index] = function() {
            markerArray[index].openInfoWindowHtml(caption);
        }

        return marker;
    }

    function filterTags(tag) {
        if (tag == '') {
            // special case - show all
            for (var i = 0; i < markerLength; i++) {
                if (markersShown[i] == false) {
                    // Display it.
                    markersShown[i] = true;
                    map.addOverlay(markerArray[i]);
                    var divInfo = document.getElementById("entry" + i);
                    divInfo.style.display = "";
                }
            }
            return;
        }
        var tagRE = new RegExp("\\|" + tag + "\\|");
        for (var i = 0; i < markerLength; i++) {
            if (markerTagStrings[i].match(tagRE)) {
                // Display the text and marker
                if (markersShown[i] == false) {
                    // We need to display it.
                    markersShown[i] = true;
                    map.addOverlay(markerArray[i]);
                    var divInfo = document.getElementById("entry" + i);
                    divInfo.style.display = "";
                }
            } else {
                // Hide text and marker
                if (markersShown[i] == true) {
                    // Hide it.
                    markersShown[i] = false;
                    map.removeOverlay(markerArray[i]);
                    var divInfo = document.getElementById("entry" + i);
                    divInfo.style.display = "none";
                }
            }
        }
    }

    var request = GXmlHttp.create();
    //request.open("GET", "data2.xml", true);
    request.open("GET", xmlFileName, true);
    request.onreadystatechange = function() {
    if (request.readyState == 4) {
		var xmlDoc = request.responseXML;
		var markers = xmlDoc.documentElement.getElementsByTagName("marker");
		markerLength = markers.length;
		for (var i = 0; i < markers.length; i++) {
			markerPointsArray[i] = new GPoint(parseFloat(markers[i].getAttribute("lng")),parseFloat(markers[i].getAttribute("lat")));
			var colorMarker = new String(markers[i].getAttribute("color"));
			markerTitles[i] = new String(markers[i].getAttribute("title"));
			var captionText = new String(markers[i].getAttribute("caption"));
			var latText = new String(markers[i].getAttribute("lat"));
			var lngText = new String(markers[i].getAttribute("lng"));
			markerAddresses[i] = new String(markers[i].getAttribute("address"));
			markerCityZips[i] = new String(markers[i].getAttribute("cityZip"));
			var url = new String(markers[i].getAttribute("url"));
			var races = new String(markers[i].getAttribute("races"));
            var raceid = new String(markers[i].getAttribute("raceid"));
//	            var toform = '<form action="http://maps.google.com/maps" method="get" target="_blank" class="tiny">';
//	            toform += 'Enter your home address here: <br /><input type="text" name="saddr" value="" size=30 class="tiny"><br />';
//	            toform += '<input type="hidden" name="daddr" value="' + latText + ', ' + lngText + '" />';
//	            toform += '<input type="submit" value="Directions"/></form>';				
				
			var addrinfo = '<p class="tiny">Event info:<br>' + races +'<br>'+ markerAddresses[i] + '<br></p>';
			var website = '<a href="' + url + '" target="_blank" class="tiny">Website</a>';
			var zoomin = '&nbsp;|&nbsp;<a href="javascript:zoomIN'+markerPointsArray[i]+';" class="tiny">Zoom In</a>';
			var html = '<table border="0" cellspacing="0" cellpadding="2"><tr><td><img src="images/'+raceid+'.jpg" width="150" height="100" /></td><td>&nbsp;</td><td>'+captionText+'<br><b><u>'+markerTitles[i]+'</u></b><p class="tiny">Event info:<br>' + races +'<br>'+ markerAddresses[i] + '<br></p></td></tr></table>';
			

//          var report = '&nbsp;|&nbsp;<a href="mailto:admin@trimapper.com?subject=Update/Bad%20TRI&body=Update/Bad%20TRI:  Race ID: '+raceid+'  Tri: '+markerTitles[i]+'" class="tiny">Update/Bad TRI</a>';			
			

 
			if (document.getElementById('loadingMessage')){	
				document.getElementById('loadingMessage').innerHTML = "Loading " + i + "of " + markerLength;
			}
								 
//            markerArray[i] = createMarker(markerPointsArray[i], captionText+"<br><b><u>" + markerTitles[i] + "</u></b>" + addrinfo+website+zoomin, i, colorMarker);
			markerArray[i] = createMarker(markerPointsArray[i], html+website+zoomin, i, colorMarker);
            map.addOverlay(markerArray[i]);
			markerTagStrings[i] = new String(markers[i].getAttribute("tags"));
			var entry = document.createElement("div");
			entry.setAttribute("id", "entry" + i);
            entry.setAttribute("style", "");
            var boldPart = document.createElement("b");
            var linkPart = document.createElement("a");
            linkPart.setAttribute("href", "javascript:callback" + i + "();");
            var boldText = document.createTextNode(markerTitles[i]);
            boldPart.appendChild(boldText);
            linkPart.appendChild(boldPart);

//            var captionPart = document.createTextNode(" = " + markerCityZips[i]);
			var captionLoc = document.createTextNode(markerCityZips[i]);
			var br = document.createElement("br");



			// Find the tags.
            var tagPart = document.createTextNode(" Tags: ");
            var tagsPart = document.createElement("span");
            var tempString = markerTagStrings[i];
            // Skip the first '|'
            tempString = tempString.substring(1);
            for (; tempString.length > 0;) {
				var nextPipe = tempString.indexOf('|');
					if (nextPipe == -1) {
                        // String is busticated.
                        tempString = ''
                    } else {
                        var nextTag = tempString.substring(0, nextPipe);
                        addTagToList(nextTag);
                        // Add links to tags
                        tempString = tempString.substring(nextPipe+1);
                        var tempLinkPart = document.createElement("a");
                        tempLinkPart.setAttribute("href", "javascript:filterTags('" + nextTag + "');");
                        var tempLinkText = document.createTextNode(nextTag);
                        var space = document.createTextNode(" ");
                        tempLinkPart.appendChild(tempLinkText);
                        tagsPart.appendChild(tempLinkPart);
                        tagsPart.appendChild(space);
                    }
                }

                entry.appendChild(linkPart);
//                entry.appendChild(captionPart);
//                entry.appendChild(tagPart);
//                entry.appendChild(tagsPart);
                info.appendChild(entry);
				entry.appendChild(br);
				info.appendChild(entry);
				entry.appendChild(captionLoc);
				info.appendChild(entry);
            }
            // Sort the tags.
            allTags = new Array();
            var j = 0;
            for (tag in tagToCountTable) {
                allTags[j] = tag;
                j++;
            }
            // Use this to sort by count
            //allTags.sort(sortByCount);
            allTags.sort();
 
            // Add the list of all tags
            var tags = document.getElementById("sc1");
            var monthtags = document.getElementById("sc2");
            var tagAllEntry = document.createElement("a");
            tagAllEntry.setAttribute("href", "javascript:filterTags('');");
            var tagAllText = document.createTextNode('(All)(' + markerLength + ')');
            tagAllEntry.appendChild(tagAllText);
            tags.appendChild(tagAllEntry);
            var space = document.createTextNode(' ');
            tags.appendChild(space);

            // And insert them.
            var space = document.createTextNode(' ');
            for (var j = 0; j < allTags.length; j++) {
                var tempLinkEntry = document.createElement("a");
                tempLinkEntry.setAttribute("href", "javascript:filterTags('" + allTags[j] + "');");
                var tempLinkText = document.createTextNode(allTags[j] + "(" + tagToCountTable[allTags[j]] + ")");
                tempLinkEntry.appendChild(tempLinkText);
	//			alert("value:"+allTags[j]);
				if (allTags[j] == ' January ' || allTags[j] == ' February ' || allTags[j] == ' March ' || allTags[j] == ' April ' || allTags[j] == ' May ' || allTags[j] == ' June ' || allTags[j] == ' July ' || allTags[j] == ' August ' || allTags[j] == ' September ' || allTags[j] == ' October ' || allTags[j] == ' November ' || allTags[j] == ' December ' ) {
                monthtags.appendChild(tempLinkEntry);
                var space = document.createTextNode(' ');
                monthtags.appendChild(space);				
				} else {
                tags.appendChild(tempLinkEntry);
                var space = document.createTextNode(' ');
                tags.appendChild(space);
				}
            }
            for (var j = 0; j < markerLength; j++) {
                markersShown[j] = true;
                eval('callback' + j + ' = function() {markerCallbacks[' + j + ']();}');
            }

        } 
    }
    request.send(null);
    //]]>
