    //<![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();
    geocoder = new GClientGeocoder();


// nlm added
	GEvent.addListener(map, "moveend", function() {
//c	var center = map.getCenterLatLng();
    var center = map.getCenter();
//c	var latLngStr = '(' + center.y + ', ' + center.x + ')';
//c	var bounds = map.getBoundsLatLng();
//    document.getElementById("message").innerHTML = latLngStr + "<br>"+bounds;
    if(uriq == "debuglog"){
 	   GLog.write('getCenter: ' + map.getCenter().toString() + ' zoom: ' + map.getZoom().toString() + ' bounds: ' + map.getBounds().toString()); 
	}
	});


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


    function showAddress(address) {
      if (geocoder) {
        geocoder.getLatLng(
          address,
          function(point) {
            if (!point) {
              alert(address + " not found");
            } else {
              map.setCenter(point, 7);
//              var marker = new GMarker(point);
//              map.addOverlay(marker);
//              marker.openInfoWindowHtml(address);
            }
          }
        );
      }
    }



    function resetMapPosition() {
	switch(uriq) {
	case "region=sa":
	    map.setCenter(new GLatLng(-25.005972,-56.562891), 3);
		pagelink = '<a href="'+document.URL+'">Triathlons in South America</a>';
		document.title = "TRImapper.com - South America Triathlon Finder, Triathlons in South America";
		break;
	case "cntry=ar":
	    map.setCenter(new GLatLng(-38.822590,-67.060546), 4);
		pagelink = '<a href="'+document.URL+'">Triathlons in Argentina</a>';
		document.title = "TRImapper.com - Argentina Triathlon Finder, Triathlons in Argentina";
		break;
	case "cntry=br":
	    map.setCenter(new GLatLng(-15.538375,-54.843750), 4);
		pagelink = '<a href="'+document.URL+'">Triathlons in Brazil</a>';
		document.title = "TRImapper.com - Brazil Triathlon Finder, Triathlons in Brazil";
		break;
	case "cntry=ci":
	    map.setCenter(new GLatLng(-35.817813,-70.400390), 4);
		pagelink = '<a href="'+document.URL+'">Triathlons in Chile</a>';
		document.title = "TRImapper.com - Chile Triathlon Finder, Triathlons in Chile";
		break;
	case "cntry=ec":
	    map.setCenter(new GLatLng(-1.713611,-78.365478), 3);
		pagelink = '<a href="'+document.URL+'">Triathlons in Ecuador</a>';
		document.title = "TRImapper.com - Ecuador Triathlon Finder, Triathlons in Ecuador";
		break;
	case "cntry=pe":
	    map.setCenter(new GLatLng(-9.535748,-76.245117), 5);
		pagelink = '<a href="'+document.URL+'">Triathlons in Peru</a>';
		document.title = "TRImapper.com - Peru Triathlon Finder, Triathlons in Peru";
		break;
	case "cntry=uy":
	    map.setCenter(new GLatLng(-32.620870,-55.711669), 3);
		pagelink = '<a href="'+document.URL+'">Triathlons in Uruquay</a>';
		document.title = "TRImapper.com - Uruquay Triathlon Finder, Triathlons in Uruquay";
		break;
	case "cntry=ve":
	    map.setCenter(new GLatLng(7.406047,-66.511230), 6);
		pagelink = '<a href="'+document.URL+'">Triathlons in Venezuela</a>';
		document.title = "TRImapper.com - Venezuela Triathlon Finder, Triathlons in Venezuela";
		break;
	default:
	    map.setCenter(new GLatLng(-23.537868,-56.562891), 3);
		pagelink = '<a href="'+document.URL+'">Triathlons in South America</a>';
		break;
	}
    }
    resetMapPosition();

    var baseIcon = new GIcon();
//    baseIcon.image = "icons/marker.png";
//    baseIcon.shadow = "icons/shadow50.png";
//    baseIcon.iconSize = new GSize(20, 34);
    baseIcon.iconSize = new GSize(12,20);
//    baseIcon.shadowSize = new GSize(37, 34);
    baseIcon.iconAnchor = new GPoint(6, 20);
    baseIcon.infoWindowAnchor = new GPoint(6,6);

    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/smarker_" + 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;
        }
        switch(tag) {
        case "Olympic / International ":
        var tagRE1 = new RegExp("\\|" + " Olympic " + "\\|");
        var tagRE2 = new RegExp("\\|" + " International " + "\\|");
        for (var i = 0; i < markerLength; i++) {
            if (markerTagStrings[i].match(tagRE1) || markerTagStrings[i].match(tagRE2)) {
                // 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";
                }
            }
        }
          break;

        case "Half / Long ":
        var tagRE1 = new RegExp("\\|" + " Half " + "\\|"); 
        var tagRE2 = new RegExp("\\|" + " Long " + "\\|");
        for (var i = 0; i < markerLength; i++) {
            if (markerTagStrings[i].match(tagRE1) || markerTagStrings[i].match(tagRE2)) {
                // 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";
                }
            }
        }
          break;

        case "Sprint / Short ":
        var tagRE1 = new RegExp("\\|" + " Sprint " + "\\|"); 
        var tagRE2 = new RegExp("\\|" + " Short " + "\\|");
        for (var i = 0; i < markerLength; i++) {
            if (markerTagStrings[i].match(tagRE1) || markerTagStrings[i].match(tagRE2)) {
                // 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";
                }
            }
        }
          break;

        case "Xterra / Off-Road ":
        var tagRE1 = new RegExp("\\|" + " Xterra " + "\\|"); 
        var tagRE2 = new RegExp("\\|" + " Off-Road " + "\\|");
        for (var i = 0; i < markerLength; i++) {
            if (markerTagStrings[i].match(tagRE1) || markerTagStrings[i].match(tagRE2)) {
                // 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";
                }
            }
        }
          break;

        default:
        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";
                }
            }
        }
          break;
        }
    }

    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 hotels = '&nbsp;|&nbsp;<a href="http://maps.google.com/maps?q=hotels+loc:'+latText+','+lngText+'('+markerTitles[i]+')" target="_blank" class="tiny">Hotels</a>';

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+hotels+zoomin+report, 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);
						
                        if(nextTag == " Olympic " || nextTag == " International "){
                           nextTag = "Olympic / International ";
							}
                        if(nextTag == " Xterra " || nextTag == " Off-Road "){
                           nextTag = "Xterra / Off-Road ";
							}
                        if(nextTag == " Half " || nextTag == " Long "){
                           nextTag = "Half / Long ";
							}
                        if(nextTag == " Sprint " || nextTag == " Short "){
                           nextTag = "Sprint / Short ";
							}
						
                        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);
    //]]>
