function clickLoad (e) {
        
        if (map.getZoom() < 10) {
            $('nodeList').innerHTML = "Zoom in further to view features.";
            return; 
        }  
        OpenLayers.ProxyHost = "./proxy.cgi?url=";
        $('nodeList').innerHTML = "";
        var tolerance = new OpenLayers.Pixel(20, 20);
        var min_px = new OpenLayers.Pixel(
                            e.xy.x - tolerance.x, e.xy.y + tolerance.y);
        var max_px = new OpenLayers.Pixel(
                            e.xy.x + tolerance.x, e.xy.y - tolerance.y);
        var min = map.getLonLatFromPixel(min_px);
        var bounds = new OpenLayers.Bounds(min.lon, min.lat, min.lon, min.lat);
        bounds.extend(map.getLonLatFromPixel(max_px));
        if (window.v) {     
            v.removeFeatures(v.features);
        }   
        add_script('http://labs.metacarta.com/osm/hc/~crschmidt/featureserver/featureserver.cgi/osm-poly/all?callback=load_poly&bbox='+bounds_as_lonlat(bounds));
        add_script('http://labs.metacarta.com/osm/hc/~crschmidt/featureserver/featureserver.cgi/osm-line/all?callback=load_lines&bbox='+bounds_as_lonlat(bounds));
        add_script('http://labs.metacarta.com/osm/hc/~crschmidt/featureserver/featureserver.cgi/osm-node/all?callback=load_nodes&bbox='+bounds_as_lonlat(bounds));
}

function load_poly(data) { load_fs_data('poly', data); }
function load_lines(data) { load_fs_data('line', data); }
function load_nodes(data) { load_fs_data('node', data); }
//function load_nodes(data) { load_fs_data('line', data); }
function load_fs_data(type, data) { 
    var listDiv = $('nodeList');
    var html = "<ul>";
    drawJSONFeatures(data);
    var features = data.features;
    var type_map = { 'line': 'way', 'poly':'way', 'node':'node'};
    for (var i = 0; i < features.length; i++) {
        var name = features[i].properties.name || "(No name)";
        var id = features[i].id;
        var data_str =  "<li><a onclick='OpenLayers.loadURL(\"./osm.cgi?" + type_map[type] + 
                        "=" + id + "\", null, null, displayItemInfo);return false' href='http://www.openstreetmap.org/api/0.3/" + 
                        type + "/" + id + "'>" + name + "</a> (<a href='#' onclick='drawFeature(\"" + type + "\", " +
                          id + ")'>View " + type + " " + id + "</a>)</li>";
        html += data_str;
        //html += "<li>"+data.features[i].properties.name+"," +data.features[i].id+"</li>";
    }
    html += "</ul>";
    listDiv.innerHTML += html;
}

function drawFeature(type,id) {

    for (var i = 0; i < v.features.length; i++) {
        if (v.features[i].attributes.id == id) {
            v.features[i].style.strokeColor = "#0000ff";
            v.features[i].layer.drawFeature(v.features[i]);
        } else {
            v.features[i].style.strokeColor = "#ff0000";
            v.features[i].layer.drawFeature(v.features[i]);
        }
    }
}

function drawJSONFeatures(feature) {
    if (!window.v) {
        v = new OpenLayers.Layer.Vector("Vector");
        map.addLayer(v);
    }
    
    var style = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']);
    style.strokeColor = "red";
    style.strokeWidth="5px";
    var feats = feature.features;
    var featureList = [];
    for (var j = 0; j < feats.length; j++) {
        var feat = feats[j];
        var coords = feats[j].geometry.coordinates;
        var vcoords = [];
        var geom = null;
        
        if (feat.geometry.type == "Polygon") {
            for(var i=0; i < coords[0].length; i++) {
                var c = coords[0][i];
                vcoords.push(new OpenLayers.Geometry.Point(merc_x(c[0]), merc_y(c[1])));
            }
            geom = new OpenLayers.Geometry.Polygon([new OpenLayers.Geometry.LinearRing(vcoords)]);
        } 
        if (feat.geometry.type == "Line") {
            for(var i=0; i < coords.length; i++) {
                vcoords.push(new OpenLayers.Geometry.Point(merc_x(coords[i][0]), merc_y(coords[i][1])));
            }
            geom = new OpenLayers.Geometry.LineString(vcoords);
        } 
        if (feat.geometry.type == "Point") {
            geom = new OpenLayers.Geometry.Point(merc_x(coords[0][0]), merc_y(coords[0][1]));
        }
        var props = feat.properties;
        OpenLayers.Util.extend(props, {'id': feat.id})
        v.addFeatures([new OpenLayers.Feature.Vector(geom, feat.properties, style)]);
    }    
}
function bounds_as_lonlat(bounds) {
        var bs = [unmerc_x(bounds.left).toFixed(5),unmerc_y(bounds.bottom).toFixed(5), unmerc_x(bounds.right).toFixed(5), unmerc_y(bounds.top).toFixed(5)].join(",");
        return bs;
}
function adjustBounds() {
        var bounds = map.getExtent();
        var bs = [unmerc_x(bounds.left).toFixed(5),unmerc_y(bounds.bottom).toFixed(5), unmerc_x(bounds.right).toFixed(5), unmerc_y(bounds.top).toFixed(5)].join(",");
        $('bounds').innerHTML=bs;
}
function add_script(url) {
    var s = document.createElement("script");
    s.src=url;
    document.getElementsByTagName("head")[0].appendChild(s);
}
function displayItemInfo (request) {
   oldhtml = $('nodeList').innerHTML;
   $('nodeList').innerHTML = request.responseText;
   $('nodeList').innerHTML += "<a href='#' onclick='$(\"nodeList\").innerHTML = oldhtml;return false'>Back</a>"; 
}

function proj_response(lonlat) {
      map.setCenter(new OpenLayers.LonLat(lonlat.lon, lonlat.lat),10);  
}
function resetcenter(lon, lat) {
    var point = merc(lon, lat);
    map.setCenter(new OpenLayers.LonLat(point[0], point[1]),10);        
}
function qpReturn(data) {
  if (data.Locations.length) {
        var best = null;
        for (var i=0; i < data.Locations.length; i++) {
                if (!best || best.Population < data.Locations[i].Population) {
                        best = data.Locations[i];
                }
        }       
    var c = best.Centroid;
    var point = merc(c[0], c[1]);
    map.setCenter(new OpenLayers.LonLat(point[0], point[1]),10);        
  }     
}
function geoParser(text) {
  add_script("http://labs.metacarta.com/GeoParser/?handler=qpReturn&output=js&loc="+text);
}

function rad_deg(ang) {
    return ang * (180.0/Math.PI)
}
function deg_rad(ang) {
    return ang * (Math.PI/180.0)
}
function merc_x(lon) {
    var r_major = 6378137.000;
    return r_major * deg_rad(lon);
}
function unmerc_x(lon) {
    var r_major = 6378137.000;
    return rad_deg(lon) / r_major;
}

function unmerc_y(y) {
   var r_major = 6378137.000;
    var r_minor = 6356752.3142;
    var temp = r_minor / r_major;
    var es = 1.0 - (temp * temp);
    var eccent = Math.sqrt(es);
    var eccnth = .5 * eccent;
    var ts = Math.exp(- y / r_major);
    var phi = Math.PI/2 - 2 * Math.atan(ts);
    var i = 0;
    dphi = 1;
    var M_PI_2 = Math.PI/2;
    while(Math.abs(dphi) > 0.000000001 && i < 15) {
      var con = eccent * Math.sin (phi);
      dphi = M_PI_2 - 2. * Math.atan (ts * Math.pow((1. - con) / 
                                            (1. + con), eccnth)) - phi;
      phi += dphi;
      i++;
    } 
    return rad_deg(phi); 
}
function merc_y(lat) {
    if (lat > 89.5)
        lat = 89.5;
    if (lat < -89.5)
        lat = -89.5;
    var r_major = 6378137.000;
    var r_minor = 6356752.3142;
    var temp = r_minor / r_major;
    var es = 1.0 - (temp * temp);
    var eccent = Math.sqrt(es);
    var phi = deg_rad(lat);
    var sinphi = Math.sin(phi);
    var con = eccent * sinphi;
    var com = .5 * eccent; 
    con = Math.pow(((1.0-con)/(1.0+con)), com);
    var ts = Math.tan(.5 * ((Math.PI*0.5) - phi))/con;
    var y = 0 - r_major * Math.log(ts);
    return y;
}
function merc(x,y) {
    return [merc_x(x),merc_y(y)]; 
}
