google.load("maps", "2");
var map;
var gdir;

function buildDimmerDiv()
{
    document.write('<div id="dimmer" class="dimmer" style="width:100%; height:' + window.screen.height +'px"></div>');
}

function addMarker(home, point, label, icon) {
    var baseIcon = new google.maps.Icon();
        baseIcon.iconSize=new google.maps.Size(24,24);
        baseIcon.shadowSize=new google.maps.Size(42,24);
        baseIcon.iconAnchor=new google.maps.Point(12,24);
        baseIcon.infoWindowAnchor=new google.maps.Point(12,0);
    var newIcon = new google.maps.Icon(baseIcon, "http://maps.google.com/mapfiles/kml/"+icon+".png", null, "http://maps.google.com/mapfiles/kml/"+icon+"s.png");

    var marker = new google.maps.Marker(point,newIcon);
    GEvent.addListener(marker, "click", function() {
        if(home.lat()==point.lat()) {
            map.setCenter(home, 14);
            map.setMapType(G_HYBRID_MAP);
        }
        else {
            document.getElementById("maplegend").innerHTML = "to "+label;
            gdir.load("from: Hanlon@"+home.lat()+","+home.lng()+" to: dest@"+point.lat()+","+point.lng());
            }
        document.getElementById("mapback").innerHTML = '<a href="javascript:resetLegend();">Back</a>';
        });
    return marker;
}


function showMap() {
    document.getElementById("dimmer").style.visibility = "visible";
    document.getElementById("gmap").style.visibility = "visible";
}

function hideMap() {
    document.getElementById("dimmer").style.visibility = "hidden";
    document.getElementById("gmap").style.visibility = "hidden";
}


function resetLegend() {
    gdir.clear();
    map.setCenter(new google.maps.LatLng(43.87959, -80.210526), 7);
    map.setMapType(G_NORMAL_MAP);
    document.getElementById("maplegend").innerHTML = "";
    document.getElementById("mapback").innerHTML = '<a href="javascript:hideMap();">Close</a>';
}

var root;
var element;
var xPos;
var yPos;
 
function window_onscroll() {   
    element.style.left = (root.scrollLeft + xPos).toString() + 'px';
    element.style.top = (root.scrollTop + yPos).toString() + 'px';
    var d = document.getElementById('dimmer');
    d.style.left="0px";
    d.style.top="0px";
}

function initialize() {
    map = new google.maps.Map2(document.getElementById("mapcontrol"));
    gdir= new google.maps.Directions(map);
    map.addControl(new google.maps.LargeMapControl());
    map.addControl(new google.maps.MapTypeControl());
    map.addOverlay(new google.maps.ScreenOverlay("logo.png", new GScreenPoint(545, 12), new GScreenPoint(0, 0), new GScreenSize(147, 30)));
    resetLegend();

    // === Array for decoding the failure codes ===
    var reasons=[];
    reasons[G_GEO_SUCCESS]            = "Success";
    reasons[G_GEO_MISSING_ADDRESS]    = "Missing Address: The address was either missing or had no value.";
    reasons[G_GEO_UNKNOWN_ADDRESS]    = "Unknown Address:  No corresponding geographic location could be found for the specified address.";
    reasons[G_GEO_UNAVAILABLE_ADDRESS]= "Unavailable Address:  The geocode for the given address cannot be returned due to legal or contractual reasons.";
    reasons[G_GEO_BAD_KEY]            = "Bad Key: The API key is either invalid or does not match the domain for which it was given";
    reasons[G_GEO_TOO_MANY_QUERIES]   = "Too Many Queries: The daily geocoding quota for this site has been exceeded.";
    reasons[G_GEO_SERVER_ERROR]       = "Server error: The geocoding request could not be successfully processed.";
    reasons[G_GEO_BAD_REQUEST]        = "A directions request could not be successfully parsed.";
    reasons[G_GEO_MISSING_QUERY]      = "No query was specified in the input.";
    reasons[G_GEO_UNKNOWN_DIRECTIONS] = "The GDirections object could not compute directions between the points.";

    // === catch Directions errors ===
    GEvent.addListener(gdir, "error", function() {
        var code = gdir.getStatus().code;
        var reason="Code "+code;
        if (reasons[code]) {
            reason = reasons[code];
        } 
        alert("Failed to obtain directions, "+reason);
    });

    GEvent.addListener(gdir, "addoverlay", function() {
        document.getElementById("maplegend").innerHTML = '<div style="font-size: 120%">' + gdir.getDistance()["html"] +" "+ document.getElementById("maplegend").innerHTML + "</div>";
        var home = gdir.getMarker(0);
        GEvent.clearListeners(home, "click");
        GEvent.addListener(home, "click", function() {
            resetLegend();
        });
        var dest = gdir.getMarker(1);
        GEvent.clearListeners(dest, "click");
        GEvent.addListener(dest, "click", function() {
            resetLegend();
        });
    });

    var request = google.maps.XmlHttp.create();
    request.open("GET", "locations.xml", true);
    request.onreadystatechange = function() {
        if (request.readyState == 4) {
            var xmlDoc = google.maps.Xml.parse(request.responseText);
            var markers = xmlDoc.documentElement.getElementsByTagName("marker");
            var hlat = parseFloat(markers[0].getAttribute("lat"));
            var hlng = parseFloat(markers[0].getAttribute("lng"));
            var hpoint = new google.maps.LatLng(hlat,hlng);
            for (var i = 0; i < markers.length; i++) {
                var lat = parseFloat(markers[i].getAttribute("lat"));
                var lng = parseFloat(markers[i].getAttribute("lng"));
                var point = new google.maps.LatLng(lat,lng);
                var label = markers[i].getAttribute("label");
                var icon = markers[i].getAttribute("icon");
                var marker = addMarker(hpoint,point,label,icon);
                map.addOverlay(marker);
            }
            var polygons = xmlDoc.documentElement.getElementsByTagName("polygon");
            for (var j = 0; j < polygons.length; j++) {
                var pnts = [];
                var points = polygons[j].getElementsByTagName("point");
                for (var k = 0; k < points.length; k++) {
                    var lat = parseFloat(points[k].getAttribute("lat"));
                    var lng = parseFloat(points[k].getAttribute("lng"));
                    pnts[k] = new google.maps.LatLng(lat,lng);
                }
                map.addOverlay(new google.maps.Polygon(pnts, "#FF0000", 2, 0.5, "#FF0000", 0.5));
            }
        }
    }
    request.send(null);
    element = document.getElementById('gmap');
    element.style.left = ((window.screen.width/2)-350).toString()+"px";
    // Fixup for IE window scroll
    if(navigator.userAgent.indexOf('MSIE') > -1) {
        root = (document.documentElement != null) ? document.documentElement : document.body;
        element = document.getElementById('gmap');
        element.style.position = 'absolute';
        var d = document.getElementById('dimmer');
        d.style.position = 'absolute';
        xPos = element.offsetLeft - root.scrollLeft;
        yPos = element.offsetTop - root.scrollTop;
        window.onscroll = window_onscroll;
    }
}

buildDimmerDiv();
google.setOnLoadCallback(initialize);
