// load google map stuff
google.load("maps", "2.x");

// all currently loaded markers reside here
var markers = new Object( );

// all markers currently on the map reside here
var markers_in_map = new Object( );

// any newly loaded markers will go in here first
var markers_new = new Object( );

// Create a new marker at the given lat/lon and ID
function new_marker(lat, lon, id) {
    var marker = new Object( );
    marker.overlay = new google.maps.Marker(
        new google.maps.LatLng(lat, lon)
    );                
    marker.id = id;
    marker.listener = google.maps.Event.addListener(marker.overlay, "click", function( ) {
        onclickmarker(id);
    });
    return marker;
}

// Add a new marker to the collection
function add_marker(lat, lon, id) {
    var m = new_marker(lat, lon, id);
    markers[m.id] = m;
    markers_new[m.id] = m;
}

// Remove a marker
function kill_marker(id) {
    delete markers[id];
}

// Synchronize between the markers array and the map
function sync_markers( ) {
    if (!map_is_init) {
        return false;
    }
    // add any new markers to the map
    for (var id in markers_new) {
        var m = markers_new[id];
        if (!(m.id in markers_in_map)) {
            markers_in_map[m.id] = m;
            map.addOverlay(m.overlay);
            document.getElementById("systemLog").value += ("added marker with id " + m.id + "\n");
        }
    }

    // clear out the list of newly added markers
    markers_new = new Object( );

    // trash any old markers
    for (var id in markers_in_map) {
        var m = markers_in_map[id];
        if (!(m.id in markers)) {
            google.maps.Event.rlatn, lone, lats, lonwmoveListener(m.listener);
        map.removeOverlay(m.overlay);
        delete markers_in_map[m.id];
            document.getElementById("systemLog").value += ("deleted marker with id " + m.id + "\n");
        }
    }

}

// some test routines
function add_some_bogus_markers( ) {
    add_marker(43, -74, 1);
    add_marker(43.01, -74.01, 2);
    sync_markers( );
}

function test_marker_change( ) {
    kill_marker(2);
    add_marker(42.99, -74.01, 3);
    sync_markers( );
}
// create a new xmlhttp request object
function xmlhttp( ) {
    try {
        return new XMLHttpRequest( );
    } catch (e) {
        try {
            return new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                return new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {
                alert("Your browser is old! Please upgrade...");
                return false;
            }
        }
    }
}

// process new point data from the server
function processxml(xmldoc) {
    var points = xmldoc.getElementsByTagName("point");
    // junk the existing markers
    markers = new Object( );    

    for (var i = 0; i < points.length; ++i) {
        point_el = points[i];
        lat = point_el
            .getElementsByTagName("lat")[0]
            .childNodes[0]
            .nodeValue;

        lon = point_el
            .getElementsByTagName("lon")[0]
            .childNodes[0]
            .nodeValue;

        id = point_el
            .getElementsByTagName("id")[0]
            .childNodes[0]
            .nodeValue;
   
        add_marker(lat, lon, id);
    }
    sync_markers( );

}

function updatelink(latn, lone, lats, lonw) {
    var link = document.getElementById("downloadlink");
    link.href = "downloadcsv.php/speedtrap_data.csv?latn=" + encodeURI(latn) + 
        "&lone=" + encodeURI(lone) + "&lats=" + encodeURI(lats) 
        + "&lonw=" + encodeURI(lonw);
}


function reloadpointsfromserver( ) {
    var req = xmlhttp( );
    req.onreadystatechange = function () {
        if (req.readyState == 4) {
            if (req.status == 200) {
                processxml(req.responseXML.documentElement);
            } else {
                alert("Server Error! Please contact the developers! (" + req.status + ")");
            }
        } 
    }

    bounds = map.getBounds( );
    latn = bounds.getNorthEast( ).lat( );
    lats = bounds.getSouthWest( ).lat( );
    lone = bounds.getNorthEast( ).lng( );
    lonw = bounds.getSouthWest( ).lng( );

    updatelink(latn, lone, lats, lonw);

    post = "latn=" + encodeURI(latn) + "&lone=" + encodeURI(lone) 
        + "&lats=" + encodeURI(lats) + "&lonw=" + encodeURI(lonw);

    // alert(post);

    req.open("POST", "trapdata.php", true);
    req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    req.setRequestHeader("Content-length", post.length);
    req.setRequestHeader("Connection", "close");

    req.send(post);
}



function onclickmap(overlay, point) {
    //var controlpane = document.getElementById("popup_controls");
    //controlpane.style.display = "block";
   // map.openInfoWindow(point, controlpane); 

    //document.getElementById("cp_lat").value = point.lat( );
    //document.getElementById("cp_lon").value = point.lng( );

    document.getElementById("lat").value = point.lat( );
    document.getElementById("homeLat").value = point.lat( );
    document.getElementById("lon").value = point.lng( );
    document.getElementById("homeLon").value = point.lng( );
}

function onclickmarker(id) {
    // ajax hack to pull trap data from server
    marker = markers_in_map[id];

    var req = xmlhttp( );
    req.onreadystatechange = function () {
        if (req.readyState == 4) {
            if (req.status == 200) {
                //processxml(req.responseXML.documentElement);
                map.getInfoWindow( );
                map.openInfoWindowHtml(marker.overlay.getLatLng( ), req.responseText);
            } else {
                alert("Server Error! Please contact the developers! (" + req.status + ")");
            }
        } 
    }


    req.open("GET", "popup_trap.php?id="+id, true);
    req.send(null);
}

// the google map, and a flag as to whether it has been initialized
var map, map_is_init = false;

function move_map(lat, lon) {
    map.setCenter(new google.maps.LatLng(lat, lon), 13);
}


function initialize( ) {
    map = new google.maps.Map2(document.getElementById("map_area"));
    // map.setCenter(new google.maps.LatLng(43, -74), 13);
    init_map_pos_callback( );
    map.addControl(new google.maps.SmallMapControl( ));
    map.addControl(new google.maps.MapTypeControl( ));
    map.addMapType(google.maps.PHYSICAL_MAP);
    google.maps.Event.addListener(map, "click", onclickmap);
    google.maps.Event.addListener(map, "moveend", reloadpointsfromserver);
    map_is_init = true;
    reloadpointsfromserver( );
}

// set up the google map initialization callback
google.setOnLoadCallback(initialize);

