/* 
    NOTE: Check the position of GOverviewMapControl in final page. 
    It is different in Firefox and Internet Explorer.

    Consider: (may be buggy -- check google groups)
    o = new GOverviewMapControl(new Gsize(200,200));
    o.hide();
*/

DEFAULT_SEARCH = 'http://peer.berkeley.edu/nga/xml/earthquakes';
EARTHQUAKE_SEARCH = 'http://peer.berkeley.edu/nga/xml/earthquakes';
STATION_SEARCH = 'http://peer.berkeley.edu/nga/xml/stations';
RECORD_SEARCH = 'http://peer.berkeley.edu/nga/search';

STATION_LEGEND = 'Hypocenter: Blue. Vs30: Light yellow (low) to red (high).'

READY_STATE_UNINITIALIZED= 0;
READY_STATE_LOADING      = 1;
READY_STATE_LOADED       = 2;
READY_STATE_INTERACTIVE  = 3;
READY_STATE_COMPLETE     = 4;

var map; 
var bounds = new GLatLngBounds();
var DEFAULT_CENTER = new GLatLng(40.0, -113.0);
var DEFAULT_ZOOM = 4;
var CLOSER_ZOOM = 6;

function initMap() {

    if (GBrowserIsCompatible()) {

      map = new GMap2(document.getElementById('map'));
      map.addControl(new GSmallMapControl());
      map.addControl(new GMapTypeControl());
      map.addControl(new GScaleControl());
      map.setCenter(DEFAULT_CENTER, DEFAULT_ZOOM);
      map.addControl(new GOverviewMapControl());

    }

    else {
      alert('Sorry, the Google Maps API is not compatible with this browser.');
    }
}

function removeOldMarkers() {

    map.closeInfoWindow();
    map.clearOverlays();
}

function updateEarthquakes() {

    setStatus('Updating map');
    removeOldMarkers();

    var requestParams = [];

    var nga_form = document.getElementById('nga_form');
    for (var i=0; i< nga_form.elements.length; i++) {
        var formitem = nga_form.elements[i];
        requestParams.push(formitem.name+'='+encodeURIComponent(formitem.value));
    }
    // If display map area only, get the bounds
    if (document.getElementById('nga_form').elements.loc.value == 'map') {
        bounds = map.getBounds();
        var southWest = bounds.getSouthWest();
        var northEast = bounds.getNorthEast();
        requestParams.push('latNE='+northEast.lat());
        requestParams.push('latSW='+southWest.lat());
        requestParams.push('lngNE='+northEast.lng());
        requestParams.push('lngSW='+southWest.lng());
    }

    loadNewDataset(EARTHQUAKE_SEARCH, requestParams, updateMarkers);
}

function setStatus(msg) {
    var status = document.getElementById('status');
    status.firstChild.nodeValue = msg;
}

function handleError(status, msg) {
    setStatus(status + ' ' + msg);
}

function buildURL(baseUrl, requestParams) {

    var url = baseUrl;
    if (requestParams.length > 0) {
        for (var i=0; i < requestParams.length; i++) {
            if (i == 0) {
                url += '?';
            }
            url += requestParams[i];
            url += '&';
        }
    }

    // Remove the trailing &
    url = url.substring(0,url.length-1);

    return url;
}

function loadNewDataset(baseUrl, requestParams, responseAction) {

    var url = buildURL(baseUrl,requestParams);

    var request = GXmlHttp.create();
    request.open('GET',url,true);

    request.onreadystatechange = function() {
        if (request.readyState == READY_STATE_COMPLETE) {
            if (request.status == 200) {
                responseAction(request.responseXML);
            }
            else {
                handleError(request.status, 'Error retrieving data from server or no results were found.');
            }
        }
    }
    request.send(null); 
}

function updateMarkers(responseXML) {
 
    var gmarkers = [];
    var markers = 
        responseXML.documentElement.getElementsByTagName('marker');
    for (var i = 0; i < markers.length; i++) {
        var lat = parseFloat(markers[i].getAttribute('lat'));
        var lng = parseFloat(markers[i].getAttribute('lng'));
        var info = markers[i].getAttribute('info');
        var label = markers[i].getAttribute('name');
        var point = new GLatLng(lat,lng);
        var marker = new GMarker(point);
        marker.nga_info = info;
        marker.nga_name = label;
        map.addOverlay(marker);
        gmarkers.push(marker);

        GEvent.addListener(map, 'click', function(overlay, point) {
            if (overlay) {
                if (overlay.nga_info) {
                    overlay.openInfoWindowHtml(overlay.nga_info);
                }
            }
        });      
    }

    setStatus('Records found: ' + markers.length);

}

function search() {

    setStatus('Searching');
    removeOldMarkers();

    var nga_form = document.getElementById('nga_form');

    // If display map area only, get the bounds and store to hidden fields
    // Refactor to use the same technique above.
    if (nga_form.elements.loc.value == 'map') {
        bounds = map.getBounds();
        var southWest = bounds.getSouthWest();
        var northEast = bounds.getNorthEast();

        nga_form.elements.latSW.value = southWest.lat();
        nga_form.elements.latNE.value = northEast.lat();
        nga_form.elements.lngSW.value = southWest.lng();
        nga_form.elements.lngNE.value = northEast.lng();
    }

    var requestParams = [];

    for (var i=0; i< nga_form.elements.length; i++) {
        var formitem = nga_form.elements[i];
        requestParams.push(formitem.name+'='+encodeURIComponent(formitem.value));
    }

    if (nga_form.elements.format.value == 'xml') {
        loadNewDataset(RECORD_SEARCH, requestParams, updateMarkers);
    }
    else {
        nga_form.submit();
    }
    
}

function updateStations() {

    setStatus('Updating map');
    removeOldMarkers();

    // Handle the interim qqid passed as parameter 
    var p_form = document.getElementById('p_form');
    var qqid = p_form.elements.qqid.value;

    var nga_form = document.getElementById('nga_form');
    nga_form.elements.qid.value = qqid;

    // If display map area only, get the bounds and store to hidden fields

    if (nga_form.elements.loc.value == 'map') {
        bounds = map.getBounds();
        var southWest = bounds.getSouthWest();
        var northEast = bounds.getNorthEast();

        nga_form.elements.latSW.value = southWest.lat();
        nga_form.elements.latNE.value = northEast.lat();
        nga_form.elements.lngSW.value = southWest.lng();
        nga_form.elements.lngNE.value = northEast.lng();
    }

    var requestParams = [];

    for (var i=0; i< nga_form.elements.length; i++) {
        var formitem = nga_form.elements[i];
        requestParams.push(formitem.name+'='+encodeURIComponent(formitem.value));
    }

    loadNewDataset(STATION_SEARCH, requestParams, updateStationMarkers);
}

function updateStationMarkers(responseXML) {
 
    var gmarkers = [];

    // We only have an earthquake if we browsed earthquakes first
    try {
        var markers = 
            responseXML.documentElement.getElementsByTagName('earthquake');
        for (var i = 0; i < markers.length; i++) {
            var lat = parseFloat(markers[i].getAttribute('lat'));
            var lng = parseFloat(markers[i].getAttribute('lng'));
            var info = markers[i].getAttribute('info');
            var label = markers[i].getAttribute('name');
            var code = markers[i].getAttribute('code');
            var point = new GLatLng(lat,lng);
            var marker = createMarker(point, BLUE, code, info);

            map.addOverlay(marker);
            gmarkers.push(marker);

            map.setCenter(point, CLOSER_ZOOM);
        }
    }
    catch (err) {
        // TO-DO 
        // alert('Error ' + err.name +  ' ' + err.message);
    }

    var markers = 
        responseXML.documentElement.getElementsByTagName('station');
    for (var i = 0; i < markers.length; i++) {
        var lat = parseFloat(markers[i].getAttribute('lat'));
        var lng = parseFloat(markers[i].getAttribute('lng'));
        var info = markers[i].getAttribute('info');
        var label = markers[i].getAttribute('name');
        var code = markers[i].getAttribute('code');
        var point = new GLatLng(lat,lng);
        var marker = createMarker(point, RED, code, info);

        map.addOverlay(marker);
        gmarkers.push(marker);
    }

    setStatus('Records found: ' + markers.length);
    addLegend(STATION_LEGEND);
}

function createMarker(point, color, code, html) {
    var nga_icon = getIcon(color, code); 
    var marker = new GMarker(point, nga_icon);
    if (html != null) {
        GEvent.addListener(marker,'click',function() {
            marker.openInfoWindowHtml(html);
        });
    }
    return marker;
}

function addLegend(msg) {
    var legend = document.getElementById('legend');
    legend.firstChild.nodeValue = msg;
}

/* 
    This Javascript is based on code provided by the
    Blackpool Community Church Javascript Team
    http://www.commchurch.freeserve.co.uk/   
    http://www.econym.demon.co.uk/googlemaps/

    Markers courtesy of Sam Kuhn:

    http://people.vanderbilt.edu/~sam.kuhn/gmaps/index.html
*/
