﻿// saved map views
/* object<string, object> */var regions =
{
    regional: {lat: 0, lng: 0, zoom: 7},
    /*statewide: {lat: 44.15, lng: -89.12, zoom: 7},*/
    /*statewide: {lat: 43.12, lng: -88.32, zoom: 6}, */
    statewide: {lat: 45.25, lng: -89.12, zoom: 6},
    northwest: {lat: 45.298, lng: -90.087, zoom: 7},
    northcentral: {lat: 45.313, lng: -89.989, zoom: 7},
    northeast: {lat: 44.543, lng: -87.566, zoom: 8},
    southwest: {lat: 43.353, lng: -89.577, zoom: 8},
    southeast: {lat: 43.269, lng: -88.467, zoom: 8},
    milwaukee: {lat: 43.01, lng: -87.92, zoom: 11},
    madison: {lat: 43.096, lng: -89.323, zoom: 11},
    greenbay: {lat: 44.50, lng: -88.01, zoom: 11},
    wausau: {lat: 44.95, lng: -89.64, zoom: 11},
    eauclaire: {lat: 44.866, lng: -91.402, zoom: 10},
    greenbayappleton: {lat: 44.35, lng: -88.19, zoom: 10},
    milwaukeegreenbay: {lat: 43.79, lng: -88.10, zoom: 8},
    milwaukeemadison: {lat: 43.07, lng: -88.59, zoom: 9},
    winterroads: {lat: 43.12, lng: -88.32, zoom: 8}
}

// map objects
/* com.ibigroup.googlemaps.Map */var map;
/* com.ibigroup.googlemaps.OverlayManager */var overlayManager;

// color selectors
/* com.ibigroup.map.ColorSelector */var roadConditionColorSelector;
/* com.ibigroup.map.ColorSelector */var trafficSpeedColorSelector;

// legend warnings
/* gov.wi511.map.WarningUI */var zoomWarning;
/* gov.wi511.map.WarningUI */var exclusiveWarning;

// legend items
/* gov.wi511.googlemaps.RoadConditionLegendItem */var roadConditionLegendItem;
/* gov.wi511.googlemaps.TrafficSpeedLegendItem */var trafficSpeedLegendItem;
/* gov.wi511.googlemaps.CameraLegendItem */var cameraLegendItem;
/* gov.wi511.googlemaps.MessageSignLegendItem */var messageSignLegendItem;
/* gov.wi511.googlemaps.IncidentLegendItem */var incidentLegendItem;
/* gov.wi511.googlemaps.RoadClosureLegendItem */var roadClosureLegendItem;
/* gov.wi511.googlemaps.FutureRoadClosureLegendItem */var futureRoadClosureLegendItem;
/* com.ibigroup.googlemaps.LegendItem[] */var legendItems = [];

// event listeners
/* Handle */var regionSelectChangeListener;
/* GEventListener */var mapZoomListener;
/* Handle */var roadConditionCheckedChangeListener;
/* Handle */var trafficSpeedCheckedChangeListener;
/* Handle */var roadConditionColorChangeListener;
/* Handle */var trafficSpeedColorChangeListener;
/* object[] */var stateChangedListeners = [];
/* Handle[] */var regionClickListeners = [];
/* Handle */var loadingUILastUpdatedListener;

/* void */var maps_google_load = function()
{
    dojo.require("dojo.cookie");
    dojo.require("com.ibigroup.NumberLib");
    dojo.require("com.ibigroup.StringLib");
    dojo.require("com.ibigroup.map.ColorSelector");
    dojo.require("com.ibigroup.googlemaps.Map");
    dojo.require("com.ibigroup.googlemaps.OverlayManager");
    dojo.require("gov.wi511.map.LoadingUI");
    dojo.require("gov.wi511.map.LegendUI");
    dojo.require("gov.wi511.map.WarningUI");
    dojo.require("gov.wi511.map.ColorSelectUI");
    dojo.require("gov.wi511.googlemaps.RoadConditionLegendItem");
    dojo.require("gov.wi511.googlemaps.TrafficSpeedLegendItem");
    dojo.require("gov.wi511.googlemaps.CameraLegendItem");
    dojo.require("gov.wi511.googlemaps.MessageSignLegendItem");
    dojo.require("gov.wi511.googlemaps.IncidentLegendItem");
    dojo.require("gov.wi511.googlemaps.RoadClosureLegendItem");
    dojo.require("gov.wi511.googlemaps.FutureRoadClosureLegendItem");
    dojo.require("gov.wi511.googlemaps.Other511Marker");

    dojo.addOnLoad(function() { var timeout = setTimeout(function() { maps_dojo_load(); }, 100); });
    dojo.addOnUnload(maps_dojo_unload);
}

/* void */var overlayManager_changed = function(/* number */shownOverlays)
{
    console.log("shown overlays: " + shownOverlays);
}

/* void */var maps_dojo_load = function()
{
    // read cookie
    /* object */var cookieData = dojo.fromJson(dojo.cookie("WI511Map"));
    if (cookieData == null)
    {
        cookieData = {};
    }
    // read in query string region parameter
    if (typeof(serverVars.region) == "string" && regions[serverVars.region] != null)
    {
        cookieData.region = serverVars.region;
        cookieData.lat = regions[serverVars.region].lat;
        cookieData.lng = regions[serverVars.region].lng;
        cookieData.zoom = regions[serverVars.region].zoom;
    }
    if (!com.ibigroup.NumberLib.isNumeric(cookieData.lat) || !com.ibigroup.NumberLib.isNumeric(cookieData.lng) || !com.ibigroup.NumberLib.isNumeric(cookieData.zoom))
    {
        cookieData.region = "regional";
        cookieData.lat = regions["regional"].lat;
        cookieData.lng = regions["regional"].lng;
        cookieData.zoom = regions["regional"].zoom;
    }
    // read in query string show parameter
    if (com.ibigroup.NumberLib.isUnsignedInt(serverVars.show))
    {
        cookieData.show = serverVars.show;
    }
    if (!com.ibigroup.NumberLib.isUnsignedInt(cookieData.show))
    {
        cookieData.show = 0;
    }
    // set cookie road condition color set
    if (!com.ibigroup.NumberLib.isUnsignedInt(cookieData.roadConditionColorSet))
    {
        cookieData.roadConditionColorSet = 0;
    }
    // set cookie traffic speed color set
    if (!com.ibigroup.NumberLib.isUnsignedInt(cookieData.trafficSpeedColorSet))
    {
        cookieData.trafficSpeedColorSet = 0;
    }

    // create map
    map = new com.ibigroup.googlemaps.Map(document.getElementById("MapGoogleDiv"));
    map.addControl(new GLargeMapControl());
    map.setCenter(new GLatLng(cookieData.lat, cookieData.lng), cookieData.zoom);
    G_NORMAL_MAP.getMinimumResolution = function() { return 6; }
    
    overlayManager = new com.ibigroup.googlemaps.OverlayManager(map);
    // uncomment this line to see trace output of how many overlays are shown
    GEvent.addListener(overlayManager, "changed", overlayManager_changed);
    
    // create road condition color selector
    /* com.ibigroup.map.ColorSet[] */var roadConditionColorSets = [];
    if (serverVars != null && dojo.isArray(serverVars.roadConditionColorSets))
    {
        for (var i = 0; i < serverVars.roadConditionColorSets.length; i++)
        {
            roadConditionColorSets.push(new com.ibigroup.map.ColorSet(serverVars.roadConditionColorSets[i]));
        }
    }
    else
    {
        roadConditionColorSets.push(new com.ibigroup.map.ColorSet({type_unknown: 0}));
    }
    roadConditionColorSelector = new com.ibigroup.map.ColorSelector(roadConditionColorSets, cookieData.roadConditionColorSet);

    // create traffic speed color selector
    /* com.ibigroup.map.ColorSet[] */var trafficSpeedColorSets = [];
    if (serverVars != null && dojo.isArray(serverVars.trafficSpeedColorSets))
    {
        for (var i = 0; i < serverVars.trafficSpeedColorSets.length; i++)
        {
            trafficSpeedColorSets.push(new com.ibigroup.map.ColorSet(serverVars.trafficSpeedColorSets[i]));
        }
    }
    else
    {
        trafficSpeedColorSets.push(new com.ibigroup.map.ColorSet({type_unknown: 0}));
    }
    trafficSpeedColorSelector = new com.ibigroup.map.ColorSelector(trafficSpeedColorSets, cookieData.trafficSpeedColorSet);

    /* gov.wi511.map.LegendUI */var legendUI = new gov.wi511.map.LegendUI(document.getElementById("MapLegendDiv"), document.getElementById("MapLegendTriggerDiv"));
    // zoomWarning = new gov.wi511.map.WarningUI(document.getElementById("ZoomWarningDiv"));
    // exclusiveWarning = new gov.wi511.map.WarningUI(document.getElementById("ExclusiveWarningDiv"));
    /* gov.wi511.map.ColorSelectUI */var colorSelectUI = new gov.wi511.map.ColorSelectUI(document.getElementById("ColorOptionsDiv"), document.getElementById("ColorOptionsTriggerDiv"), document.getElementById("ColorOptionsCloseInnerDiv"), roadConditionColorSelector, trafficSpeedColorSelector);

    // create legend items
    roadConditionLegendItem = new gov.wi511.googlemaps.RoadConditionLegendItem
    (
        {
            name: "Winter Road Conditions",
            map: map,
            // overlayManager: overlayManager,
            colorSelector: roadConditionColorSelector,
            checkbox: document.getElementById("RoadConditionCheckbox"),
            xhrUrl: "MapDataService.asmx/GetWinterRoadConditions",
            xhrInterval: 300000
        }
    );
    legendItems.push(roadConditionLegendItem);

    trafficSpeedLegendItem = new gov.wi511.googlemaps.TrafficSpeedLegendItem
    (
        {
            name: "Traffic Speeds",
            map: map,
            // overlayManager: overlayManager,
            colorSelector: trafficSpeedColorSelector,
            checkbox: document.getElementById("TrafficSpeedCheckbox"),
            xhrUrl: "MapDataService.asmx/GetTrafficStatus",
            // xhrInterval: 20000,
            minZoom: 10
        }
    );
    legendItems.push(trafficSpeedLegendItem);

    cameraLegendItem = new gov.wi511.googlemaps.CameraLegendItem
    (
        {
            name: "Cameras",
            map: map,
            overlayManager: overlayManager,
            checkbox: document.getElementById("CameraCheckbox"),
            xhrUrl: "MapDataService.asmx/GetCameras"
        }
    );
    legendItems.push(cameraLegendItem);

    messageSignLegendItem = new gov.wi511.googlemaps.MessageSignLegendItem
    (
        {
            name: "Message Signs",
            map: map,
            overlayManager: overlayManager,
            checkbox: document.getElementById("MessageSignCheckbox"),
            xhrUrl: "MapDataService.asmx/GetMessageSigns"
        }
    );
    legendItems.push(messageSignLegendItem);

    incidentLegendItem = new gov.wi511.googlemaps.IncidentLegendItem
    (
        {
            name: "Incidents",
            map: map,
            overlayManager: overlayManager,
            checkbox: document.getElementById("IncidentCheckbox"),
            xhrUrl: "MapDataService.asmx/GetIncidents"
        }
    );
    legendItems.push(incidentLegendItem);

    roadClosureLegendItem = new gov.wi511.googlemaps.RoadClosureLegendItem
    (
        {
            name: "Road Closures",
            map: map,
            overlayManager: overlayManager,
            checkbox: document.getElementById("RoadClosureCheckbox"),
            xhrUrl: "MapDataService.asmx/GetRoadClosures"
        }
    );
    legendItems.push(roadClosureLegendItem);

    futureRoadClosureLegendItem = new gov.wi511.googlemaps.FutureRoadClosureLegendItem
    (
        {
            name: "Future Road Closures",
            map: map,
            overlayManager: overlayManager,
            checkbox: document.getElementById("FutureRoadClosureCheckbox"),
            xhrUrl: "MapDataService.asmx/GetFutureRoadClosures"
        }
    );
    legendItems.push(futureRoadClosureLegendItem);

    // create loading message UI
    /* gov.wi511.map.LoadingUI */var loadingUI = new gov.wi511.map.LoadingUI(document.getElementById("MapLoadingDiv"), legendItems);
    loadingUILastUpdatedListener = dojo.connect(loadingUI, "onHide", loadingUI_hide);

    // add neighboring 511 system markers
    /* minnesota */overlayManager.addOverlay(new gov.wi511.googlemaps.Other511Marker(new GLatLng(45.396393,-94.097900), {iconImage: "images/511mn.gif", url: "http://www.511mn.org"}))
    /* iowa */overlayManager.addOverlay(new gov.wi511.googlemaps.Other511Marker(new GLatLng(42.443728,-91.944580), {iconImage: "images/511ia.gif", url: "http://www.iowaroadconditions.org"}))
    // /* illinois */overlayManager.addOverlay(new gov.wi511.googlemaps.Other511Marker(new GLatLng(41.894100,-88.538818), {iconImage: "images/511il.gif", url: "http://www.dot.state.il.us"}))
    // /* michigan1 */overlayManager.addOverlay(new gov.wi511.googlemaps.Other511Marker(new GLatLng(43.854336,-86.050415), {iconImage: "images/511mi.gif", url: "http://www.michigan.gov/mdot/"}))
    // /* michigan2 */overlayManager.addOverlay(new gov.wi511.googlemaps.Other511Marker(new GLatLng(46.240652,-88.395996), {iconImage: "images/511mi.gif", url: "http://www.michigan.gov/mdot/"}))

    // ADD EVENT LISTENERS

    // add map state listeners
    mapZoomListener = GEvent.addListener(map, "zoomend", map_zoomend);
    stateChangedListeners.push(GEvent.addListener(map, "moveend", state_changed));

    // make checked state of legend items reflect cookie, and add state change listeners to all legend items
    for (var i = 0; i < legendItems.length; i++)
    {
        legendItems[i].setChecked((cookieData.show & Math.pow(2, i)) > 0);
        stateChangedListeners.push(dojo.connect(legendItems[i], "onCheckedChange", state_changed));
    }

    // add click handlers to region legend items
    /* HTMLElement[] */var regionElements = dojo.query("div.regionDiv", document.getElementById("MapLegendStaticDiv"));
    if (regionElements != null)
    {
        for (var i = 0; i < regionElements.length; i++)
        {
            regionClickListeners.push(dojo.connect(regionElements[i], "onclick", regionDiv_click));
        }
    }

    // add selectedColorSetChange listener to road condition and traffic speed color sets
    roadConditionColorChangeListener = dojo.connect(roadConditionColorSelector, "onSelectedColorSetChange", roadConditionColorSelector_colorSetChange);
    trafficSpeedColorChangeListener = dojo.connect(trafficSpeedColorSelector, "onSelectedColorSetChange", trafficSpeedColorSelector_colorSetChange);
    // add state change listeners to color selectors
    stateChangedListeners.push(dojo.connect(roadConditionColorSelector, "onSelectedColorSetChange", state_changed));
    stateChangedListeners.push(dojo.connect(trafficSpeedColorSelector, "onSelectedColorSetChange", state_changed));

    // add checkedChange listener to road condition and traffic speed legend items
    roadConditionCheckedChangeListener = dojo.connect(roadConditionLegendItem, "onCheckedChange", roadConditionLegendItem_checkedChange);
    trafficSpeedCheckedChangeListener = dojo.connect(trafficSpeedLegendItem, "onCheckedChange", trafficSpeedLegendItem_checkedChange);

    // make region selection drop down list reflect cookie state, and add change listener to it
    /* HTMLElement */var regionSelect = document.getElementById("RegionDropDownList");
    /* HTMLElement */var staticMapDiv = document.getElementById("MapStaticDiv");
    /* HTMLElement */var staticLegendDiv = document.getElementById("MapLegendStaticDiv");
    regionSelect.selectedIndex = -1;
    for (var i = 0; i < regionSelect.options.length; i++)
    {
        if (regionSelect.options[i].value == cookieData.region)
        {
            regionSelect.selectedIndex = i;
            break;
        }
    }
    regionSelectChangeListener = dojo.connect(regionSelect, "onchange", regionSelect_change);
    dojo.style(staticMapDiv, "display", (regionSelect.selectedIndex == 0) ? "block" : "none");
    dojo.style(staticLegendDiv, "display", (regionSelect.selectedIndex == 0) ? "block" : "none");

    // fire event handlers
    map_zoomend();
    loadingUI_hide();
    roadConditionColorSelector_colorSetChange();
    trafficSpeedColorSelector_colorSetChange();
    roadConditionLegendItem_checkedChange();
    trafficSpeedLegendItem_checkedChange();
    state_changed();
}

/**
 * Handler for page's unload event. Cleans up google maps variables.
 */
/* void */var maps_dojo_unload = function()
{
    overlayManager.clearOverlays();
    GUnload();
}

/**
 * zoomend handler for the map.
 */
/* void */var map_zoomend = function()
{
    /* number */var zoom = map.getZoom();
    /* bool */var found = false;

    for (var i = 0; i < legendItems.length; i++)
    {
        if (zoom < legendItems[i].getMinZoom() || zoom > legendItems[i].getMaxZoom())
        {
            found = true;
        }
    }

    /* HTMLElement */var element = document.getElementById("ZoomWarningDiv");
    dojo.style(element, "display", (found) ? "block" : "none");
}

/**
 * onSelectedColorSetChange handler for roadConditionColorSelector.
 */
/* void */var roadConditionColorSelector_colorSetChange = function()
{
    /* HTMLElement */var selectedColorElement = document.getElementById("RoadConditionSelectedColorDiv");
    /* com.ibigroup.map.ColorSet */var colorSet = roadConditionColorSelector.getSelectedColorSet();
    /* object<string, number> */var colors = colorSet.getColors();
    
    // color all swatches default color
    dojo.query(".swatchDiv", selectedColorElement).style("backgroundColor", com.ibigroup.StringLib.getHexRGB(colorSet.getDefaultColor()));

    // color each swatch its appropriate color
    for (var index in colors)
    {
        dojo.query(".swatch_" + index, selectedColorElement).style("backgroundColor", com.ibigroup.StringLib.getHexRGB(colors[index]));
    }

    roadConditionLegendItem.reset();
}

/**
 * onSelectedColorSetChange handler for trafficSpeedColorSelector.
 */
/* void */var trafficSpeedColorSelector_colorSetChange = function()
{
    /* HTMLElement */var selectedColorElement = document.getElementById("TrafficSpeedSelectedColorDiv");
    /* com.ibigroup.map.ColorSet */var colorSet = trafficSpeedColorSelector.getSelectedColorSet();
    /* object<string, number> */var colors = colorSet.getColors();
    
    // color all swatches default color
    dojo.query(".swatchDiv", selectedColorElement).style("backgroundColor", com.ibigroup.StringLib.getHexRGB(colorSet.getDefaultColor()));

    // color each swatch its appropriate color
    for (var index in colors)
    {
        dojo.query(".swatch_" + index, selectedColorElement).style("backgroundColor", com.ibigroup.StringLib.getHexRGB(colors[index]));
    }
    
    trafficSpeedLegendItem.reset();
}

/**
 * onCheckedChange handler for roadConditionLegendItem. Makes sure that road
 * conditions and traffic speeds are not shown at the same time, and shows the
 * color legend for road conditions as needed.
 */
/* void */var roadConditionLegendItem_checkedChange = function()
{
    /* bool */var checked = roadConditionLegendItem.getChecked();
    /* bool */var otherChecked = false;
    /* bool */var otherChecked = trafficSpeedLegendItem.getChecked();
    
    // show or hide the selected color div
    /* HTMLElement */var selectedColorElement = document.getElementById("RoadConditionSelectedColorDiv");
    dojo.style(selectedColorElement, "display", (checked) ? "block" : "none");

    // show or hide the exclusivity warning
    /* HTMLElement */var elements = [];
    elements.push(document.getElementById("ExclusiveWarningDiv"));
    elements.push(dojo.query("span.exclusiveSpan", document.getElementById("RoadConditionDiv"))[0]);
    elements.push(dojo.query("span.exclusiveSpan", document.getElementById("TrafficSpeedDiv"))[0]);

    for (var i = 0; i < elements.length; i++)
    {
        dojo.style(elements[i], "display", (checked || otherChecked) ? "" : "none");
    }

    if (checked && otherChecked)
    {
        // make sure that only one of road conditions and traffic speeds is checked at a time
        trafficSpeedLegendItem.setChecked(false);
    }
}

/**
 * onCheckedChange handler for trafficSpeedLegendItem. Makes sure that road
 * conditions and traffic speeds are not shown at the same time, and shows the
 * color legend for traffic speeds as needed.
 */
/* void */var trafficSpeedLegendItem_checkedChange = function()
{
    /* bool */var checked = trafficSpeedLegendItem.getChecked();
    
    /* bool */var checked = trafficSpeedLegendItem.getChecked();
    /* bool */var otherChecked = roadConditionLegendItem.getChecked();
    
    // show or hide the selected color div
    /* HTMLElement */var selectedColorElement = document.getElementById("TrafficSpeedSelectedColorDiv");
    dojo.style(selectedColorElement, "display", (checked) ? "block" : "none");

    // show or hide the exclusivity warning
    /* HTMLElement */var elements = [];
    elements.push(document.getElementById("ExclusiveWarningDiv"));
    elements.push(dojo.query("span.exclusiveSpan", document.getElementById("RoadConditionDiv"))[0]);
    elements.push(dojo.query("span.exclusiveSpan", document.getElementById("TrafficSpeedDiv"))[0]);

    for (var i = 0; i < elements.length; i++)
    {
        dojo.style(elements[i], "display", (checked || otherChecked) ? "" : "none");
    }

    if (checked && otherChecked)
    {
        // make sure that only one of road conditions and traffic speeds is checked at a time
        roadConditionLegendItem.setChecked(false);
    }
}

/**
 * Handler for the region drop down list's onChange event. Re-centers and zooms
 * the map.
 */
/* void */var regionSelect_change = function(/* object */evt)
{
    try
    {
        if (regions[evt.target.value] != null)
        {
            /* object */var region = regions[evt.target.value];
            map.setCenter(new GLatLng(region.lat, region.lng), region.zoom);
        }

        /* HTMLElement */var staticMapDiv = document.getElementById("MapStaticDiv");
        /* HTMLElement */var staticLegendDiv = document.getElementById("MapLegendStaticDiv");
        dojo.style(staticMapDiv, "display", (evt.target.selectedIndex == 0) ? "block" : "none");
        dojo.style(staticLegendDiv, "display", (evt.target.selectedIndex == 0) ? "block" : "none");
    }
    catch (exception)
    {
        // do nothing, map will not be repositioned
    }
}

/**
 * Handler for any time anything about the map state changes: fires when map
 * changes position, legend items are checked or unchecked, and color sets are
 * selected. Saves new state in the cookie.
 */
/* void */var state_changed = function()
{
    /* object */var cookieData = {};
    /* GLatLng */var centerLatLng = map.getCenter();
    /* number */var zoom = map.getZoom();
    
    // store map region, if it lines up
    for (var index in regions)
    {
        if (centerLatLng.equals(new GLatLng(regions[index].lat, regions[index].lng)) && zoom == regions[index].zoom)
        {
            cookieData.region = index;
            break;
        }
    }
    //alert("CenterLatLng:"+centerLatLng)
    // store map position
    cookieData.lat = centerLatLng.lat();
    cookieData.lng = centerLatLng.lng();
    cookieData.zoom = zoom;

    // store checked checkboxes
    cookieData.show = 0;    
    for (var i = 0; i < legendItems.length; i++)
    {
        if (legendItems[i].getChecked())
        {
            cookieData.show += Math.pow(2, i);
        }
    }
    
    // store selected color sets
    cookieData.roadConditionColorSet = roadConditionColorSelector.getSelectedIndex();
    cookieData.trafficSpeedColorSet = trafficSpeedColorSelector.getSelectedIndex();
    
    // console.log(cookieData);

    // save cookie
    dojo.cookie("WI511Map", dojo.toJson(cookieData))
}

/**
 * Handler for the legend region items' click events. Sets the region drop-down
 * list to a value, and calls its change handler.
 */
/* void */var regionDiv_click = function(/* object */evt)
{
    if (evt && evt.target)
    {
        /* string */var region = evt.target.innerHTML.split(" ").join("").toLowerCase();
        /* HTMLElement */var regionSelect = document.getElementById("RegionDropDownList");
        for (var i = 0; i < regionSelect.options.length; i++)
        {
            if (regionSelect.options[i].value == region)
            {
                regionSelect.selectedIndex = i;
                regionSelect_change({target: regionSelect});
                break;
            }
        }
    }
}

/**
 * Handler for static map's imagemap area mouseover event.
 */
/* void */var staticMapArea_mouseover = function(/* number */region)
{
    if (!com.ibigroup.NumberLib.isUnsignedInt(region))
    {
        throw new TypeError("region is not a valid number");
    }

    /* HTMLElement */var imageElement = document.getElementById("MapStaticImg");
    imageElement.src = "images/map_02_" + region + ".gif";
}

/**
 * Handler for static map's imagemap area mouseout event.
 */
/* void */var staticMapArea_mouseout = function()
{
    /* HTMLElement */var imageElement = document.getElementById("MapStaticImg");
    imageElement.src = "images/map_02.gif";
}

/**
 * Handler for static map's imagemap area click event.
 */
/* void */var staticMapArea_click = function(/* string */regionName)
{
    if (typeof(regionName) != "string")
    {
        throw new TypeError("region is not a valid string");
    }

    /* HTMLElement */var regionSelect = document.getElementById("RegionDropDownList");
    for (var i = 0; i < regionSelect.options.length; i++)
    {
        if (regionSelect.options[i].value == regionName)
        {
            regionSelect.selectedIndex = i;
            regionSelect_change({target: regionSelect});
            break;
        }
    }
    
    return false;
}

/* void */var loadingUI_hide = function(/* gov.wi511.map.loadingUI */loadingUI)
{
    /* HTMLElement */var updatedSpan = document.getElementById("LastUpdatedSpan");
    /* date */var date = new Date();
    updatedSpan.innerHTML = "Last updated on " + date.formatDate("l, F d, Y \\a\\t h:i:s A")
}

// load google maps
google.setOnLoadCallback(maps_google_load);
google.load("maps", "2");