// From JavaScript: The Definitive Guide
function getText(n)
{
    var strings = [];
    getStrings(n, strings);
    return strings;

    function getStrings(n, strings)
    {
        if (n.nodeType == 3 /* Node.TEXT_NODE */)
            strings.push(n.data);
        else
        if (n.nodeType == 1 /* Node.ELEMENT_NODE */)
        {
            for (var m = n.firstChild; m != null;
                m = m.nextSibling)
            {
                getStrings(m, strings);
            }
        }
    } // end getStrings()
} // end getText()

// Copyright (c) 2008.  Alumni.NET.  All Rights Reserved.

function loadMap(lat, lon, coordId)
{
    var map = null;

    if ((lat == 0) && (lon == 0))
        coordId = null
    else
    if (google.maps.BrowserIsCompatible() && coordId != null)
    {
        map = new google.maps.Map2(document.getElementById("mappo"));
        map.addControl(new google.maps.SmallMapControl());
        map.addControl(new google.maps.MapTypeControl());
        var point = new google.maps.LatLng(lat, lon);
        thePoint = point;
        map.setCenter(point, defaultZoomLevel);
        map.enableDoubleClickZoom();
        map.enableScrollWheelZoom();
        map.enableContinuousZoom();
        map.addOverlay(new google.maps.Marker(point));
        map.setMapType(G_HYBRID_MAP);
        /* From http://groups.google.com/group/Google-Maps-API/browse_thread/thread/3d3166c80c0c5950/2ebf9574ec0aa813?lnk=gst&q=imagery#2ebf9574ec0aa813
        */
        G_SATELLITE_MAP.getErrorMessage = function()
        {
            var z = map.getZoom();
            if (z > 0)
            {
                map.setZoom(z - 1);
                return "";
            }
            return "No data available at this zoom level.";
        }
        G_NORMAL_MAP.getErrorMessage = function()
        {
            var z = map.getZoom();
            if (z > 0)
            {
                map.setZoom(z - 1);
                return "";
            }
            return "No data available at this zoom level.";
        }
        G_HYBRID_MAP.getErrorMessage = function()
        {
            var z = map.getZoom();
            if (z > 0)
            {
                map.setZoom(z - 1);
                return "";
            }
            return "No data available at this zoom level.";
        }
    }
    return map;
}  // end loadMap()

// Taken from http://groups.google.com/group/Google-Maps-API/browse_thread/thread/ef5f704c0dd96e96/62a763f959206bb8?lnk=gst&q=auto+zoom#62a763f959206bb8
// Code by Paul Bowler
function resizeMap(map, markers)
{
   // Create new bounds object
    var bounds = new google.maps.LatLngBounds();

    // Loop through the points, extending the bounds as necessary
    //for (var i = 0; i < markers.length; i++)
    for (var k in markers)
    {
        bounds.extend(markers[k].getPoint());
    }

    // Find the centre of the new bounds
    var lat = bounds.getSouthWest().lat() + ((bounds.getNorthEast().lat()
        - bounds.getSouthWest().lat()) / 2);
    var lon = bounds.getSouthWest().lng() + ((bounds.getNorthEast().lng()
        - bounds.getSouthWest().lng()) / 2);

    // Get the bounds zoom level
    var zoom = map.getBoundsZoomLevel(bounds);

    // Change the map to the new bounds values
    if ((zoom > minZoomLevel) || (markers.length > 4))
        map.setCenter(new google.maps.LatLng(lat, lon), zoom);


} // end resizeMap()

function resizeMap2(map, markers, point)
{
    var zoom = defaultZoomLevel;
    map.setCenter(point, defaultZoomLevel);

    if (markers.length <= 5)
    {
        while (zoom >= minZoomLevel)
        {
            map.zoomOut();
            zoom--;
        }
    }

} // end resizeMap2()

function clearNewMarkers()
{
    newMarkers = [];
}

function updateMap(theMap)
{
    // wgPageName is defined somewhere somehow

    // var wgPageName = "/Asia/Philippines/Metro_Manila/Mandaluyong_City/La_Salle_Green_Hills/";
    var Url = "http://wiki.alumni.net/wiki/" + wgPageName;
    //document.write("<font size = \"-2\">" + Url + "</font>\n");
    // Display initial bounds:
    var b = theMap.getBounds();
    //document.getElementById("bounds").innerHTML = "Bounds: " + b.toString() ;
    var boundsSW = b.getSouthWest();
    var boundsNE = b.getNorthEast();
    var swLat = boundsSW.lat();
    var swLon = boundsSW.lng();
    var neLat = boundsNE.lat();
    var neLon = boundsNE.lng();

    // Initially get XML file based on query
    var xmlSrc = "http://www.alumni.net/maps/";

    xmlSrc += "getXml.php?swLat=" + swLat + "&swLon=" + swLon;
    xmlSrc += "&neLat=" + neLat + "&neLon=" + neLon;

    var request = HTTP.newRequest();
    var data = null;

    request.open("GET", xmlSrc, false);
    request.send(null);
    data = request.responseText;

    var xml = google.maps.Xml.parse(data);
    var xmlPoints = xml.documentElement.getElementsByTagName("point");
    var point = [];
    var marker = [];
    var title = [];
    var url = [];
    var theMarker = null;
    var theUrl = null;
    var count = 0;
    clearNewMarkers();
    for (var i = 0; i < xmlPoints.length; i++)
    {
        point[i] = new google.maps.LatLng(parseFloat(xmlPoints[i].getAttribute("latitude")), parseFloat(xmlPoints[i].getAttribute("longitude")));
        title[i] = xmlPoints[i].getAttribute("entity");
        url[i] = xmlPoints[i].getAttribute("url");
        
        // Add a little logic later to exclude current entity from using
        // white icon.
        var res = url[i].match(Url + "$");
	// alert("Url: " + Url + "\n" + "url[i]: " + url[i]);
        // a hack: to deal with encoded characters in title.
        title[i] = decodeURI(title[i]);
        if (res != null)
            marker[i] = new google.maps.Marker(point[i], {title : title[i]});
        else
            marker[i] = new google.maps.Marker(point[i], {title : title[i],
                icon : whiteIcon });
        if (!currMarkers[url[i]])
        {
            currMarkers[url[i]] = marker[i];
            newMarkers[url[i]] = marker[i];
            theUrl = url[i];
            theMarker = marker[i];
            // User addOverlay to place Markers
            theMap.addOverlay(theMarker);

            // Create a callback function that takes arguments.
            // Then, use the callback function as a Listener for the
            // corresponding Marker
            var f = google.maps.Event.callbackArgs(theMarker, gotoUrl,
                        theUrl);
            google.maps.Event.addListener(theMarker, "click", f);

            count++;
        }
    }


} // end updateMap()

function gotoUrl(Url)
{
    window.location = Url;
}
function countMarkers(markers)
{
    var count = 0;
    for (var i in markers)
        count++;
    return count;
}

var theMap = null;
var thePoint = null;
var defaultZoomLevel = 18;
var minZoomLevel = 12;

var whiteIcon = new google.maps.Icon();
var urlIcon = "http://www.alumni.net/maps/media/marker_white.png";
var urlShadowIcon = "http://www.alumni.net/maps/media/pin_shadow.png";
var urlTransIcon = "http://www.alumni.net/maps/media/marker_white_trans.png";

whiteIcon.image = urlIcon;
whiteIcon.shadow = urlShadowIcon;
whiteIcon.transparent = urlTransIcon;
whiteIcon.iconSize = new google.maps.Size(16, 28);
whiteIcon.shadowSize = new google.maps.Size(40, 28);
whiteIcon.iconAnchor = new google.maps.Point(8, 28);
whiteIcon.infoWindowAnchor = new google.maps.Point(8, 2);

var gmManager = null;
var currMarkers = [];
var newMarkers = [];

