//for gsp
var test;
var mgr;
var gspMarkers = [];

//for general map
var parks;
var species, speciesSum;
var sunpMap;
var polyline;
var parkCentroid;
var parkOpacity = .8;
var parks;
var coverLayer;
var streetMapType, hybridMapType;
var mapType = 'street'
var introHelpText = "Welcome to the Seattle Urban Nature interactive habitat map. This map " +
                    "provides information about Seattle's public lands. <br><br>To view detailed " +
                    "information on a park, habitat or species, click on the map. Enter an " +
                    "address above to zoom to a particular location (ex: 5218 University Way NE, " +
                    "Seattle, 98105).  For more detailed information, click on the help button " +
                    "below. ";
var speciesHelpText = "This screen summarizes species and habitat information for all of Seattle. " +
                    "<br>Click on the summary button to view pre-defined overall summary information, " +
                    "or click the 'all species' button to view percent cover distribution of " +
                    "individual species.";
var summaryHelpText = "Welcome to the Summary Overlay.  You may choose a predefined summary query to view" + 
        "parks colored by how well they fit that query definition.  <br>For example, if you choose 'total invasive species', " + 
        "parks will be colored according how many invasive species are in each park.<br>Please note it may take" + 
        "a minute to display the layer. ";     


var ms_url='http://sunp.beardedmaps.com/mapserv&';
var qry_url = 'http://sunp.beardedmaps.com/parkinfo.py?';

        
function resizeWindow(){
return false
var sh = document.body.clientHeight;
var lrh = sh - 355 - (sh /10);
document.getElementById('divSunpLinkResults').style.height = lrh + 'px';
}

//base map initialization
function loadMap() {
      if (GBrowserIsCompatible()) {
        setHelpText(introHelpText);
        sunpMap = new GMap2(document.getElementById("mapDiv"),{
            mapTypes:[G_NORMAL_MAP, G_HYBRID_MAP, G_PHYSICAL_MAP]
            });
            

        sunpMap.addControl(new GLargeMapControl3D());
        sunpMap.addControl(new GMapTypeControl());
        sunpMap.addControl(new GScaleControl());
        sunpMap.addControl(new GOverviewMapControl());
        sunpMap.setCenter(new GLatLng(47.62, -122.34), 12);
        resizeWindow();
        setLayers('habitat');
        GDownloadUrl("./parklist.json", displayParksList);
        mgr = new MarkerManager(sunpMap);
        GEvent.addListener(sunpMap, "click", function(overlay, point)  {
        if (point) {
            getParkInfo(point.y, point.x);
        }});
      }
    }

function getIcon(){
    // Create our "tiny" marker icon
    var gspIcon = new GIcon();
    gspIcon.image = "http://labs.google.com/ridefinder/images/mm_20_blue.png";
    gspIcon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
    gspIcon.iconSize = new GSize(12, 20);
    gspIcon.shadowSize = new GSize(22, 20);
    gspIcon.iconAnchor = new GPoint(6, 20);
    gspIcon.infoWindowAnchor = new GPoint(5, 1);
    // Set up our GMarkerOptions object literal
    return gspIcon
    }
    
// A function to create the marker and set up the event window
function createMarker(point,name,html) {
    var marker = new GMarker(point, { icon: getIcon() });
    var x = name + '<br>' + html;
    GEvent.addListener(marker, "click", function() {
        marker.openInfoWindowHtml(x);
    });
    // save the info we need to use later for the side_bar
    //gspMarkers[gspCount] = marker;
    //htmls[gspCount] = html;
    // add a line to the side_bar html
    // gsp_html += '<a href="javascript:myclick(' + gspCount + ')">' + name + '</a><br>';
    // gspCount++;
    return marker;
    }

// This function picks up the click and opens the corresponding info window
// function myclick(gspCount) {
    // gspMarkers[gspCount].openInfoWindowHtml(htmls[gspCount]);
    // } new
    
function addGSP(data){
    gsp = eval('(' + data + ')');
    features = gsp.features;
    for (var i=0; i<features.length; i++) {
          var f = features[i];
          var point = new GLatLng(f.geometry[1], f.geometry[0]);
          var marker = createMarker(point, f.properties.Park, f.properties.Site, f.properties.Acres);
          gspMarkers.push(marker);
        }
    mgr.addMarkers(gspMarkers,12);
    mgr.refresh();
    //document.getElementById("divSunpLinkResults").innerHTML = gsp_html;
    }
    
function setGSP(checkbox){
    if (checkbox.checked){
        test = checkbox;
        if (!gspMarkers.length) {
            GDownloadUrl('gsp.json?v=6', addGSP);
            }
        else {        
            mgr.addMarkers(gspMarkers,12);
            mgr.refresh();
            }
        }
    else {mgr.clearMarkers()}
    }
// returns the unique id of this script tag, for later removal    
function createScriptRequest(req){
    var st = document.createElement("script");
    st.setAttribute("type", "text/javascript");
    st.setAttribute("charset", "utf-8");
    st.setAttribute("src", req);
    st.setAttribute("id", Math.random().toString());
    head = document.getElementsByTagName("head").item(0);
    head.appendChild(st);
    //head.removeChild(st);
    return st.id
    }
    
    
function evalJsonSpecies(doc){
    species = eval('(' + doc+ ')');
    createSpeciesList('common');
    }
 
function evalJsonSpeciesSum(doc){
    speciesSum = eval('(' + doc+ ')');
    createSpeciesSummaryList();
    }
    
function setSpecies(type){
    var html, list;
    // change sidebar text to species info
    document.getElementById("sunpCoverQueryContainer").style.display = "block";
    document.getElementById("divSunpQueryResults").style.display = "none";
    // download species lists if not already here; else just display them
    if (!species) {
        GDownloadUrl("./species.json", evalJsonSpecies);
        GDownloadUrl("./species_sum.json", evalJsonSpeciesSum);
        }
    else {createSpeciesList(type);}
    changeSpeciesViewType('summary');
    setLayers('summary','summary_total_invasive');
    }
    
//creates select list for summary queries
function createSpeciesSummaryList(){
    html = '<select multiple size=5 name="sunpCoverSelectSum" id="sunpCoverSelectSum" onchange="setLayers(\'summary\',this.value)">';
    for (i=0; i<speciesSum.length; i++){
        html += '<option value="' + speciesSum[i][0] + '">' + speciesSum[i][1] + '</option>';
        }
    html += '</select>'
    document.getElementById("sunpCoverQuerySummary").innerHTML = html;
    document.getElementById('sunpCoverSelectSum')[0].selected = true;
    }
    
    
function createSpeciesList(type){
    html = '<span class=sclass_Yes>Native</span>,'
    html += '<span class=sclass_Invasive>Invasive</span>,'
    html += '<span class=sclass_No>Non-Native</span>,'
    html += '<span class=sclass_X>Unknown</span><br>';

    // create species lists
    html += '<select multiple size=9 name="sunpCoverSelect" id="sunpCoverSelect" onchange="setLayers(\'cover\',this.value)">';
    if (type == 'common') {list = species[0];}
    else {list = species[1];}
    for (i=0; i<list.length; i++){
        //html += '<option value="' + list[i][0] + '">' + list[i][1] + '</option>';
        html += '<option class="sclass_' + list[i][2] + '" value="' + list[i][1] + '">' + list[i][0] + '</option>';
        }
    html += '</select>'
    document.getElementById("sunpCoverQuery").innerHTML = html;
    if (type == 'scientific') {document.getElementById('sunpCoverSelect').style.fontStyle = 'italic';}
    }

function changeSpeciesViewType(type){
    if (type == 'all'){
        document.getElementById('sunpCoverQuery').style.display = 'block';
        document.getElementById('sunpCoverQuerySummary').style.display = 'none';
        document.getElementById('radioSpeciesCoverSelects').style.display = "block";
        }
    else{
        document.getElementById('sunpCoverQuery').style.display = 'none';
        document.getElementById('sunpCoverQuerySummary').style.display = 'block';
        document.getElementById('radioSpeciesCoverSelects').style.display = "none";
        }
    }
    
function setHelpText(text){
    document.getElementById('divSunpLinkResults').innerHTML = text;
    }
    
function S3Tile(a,z) {
    var base_url = 'http://tilecache.sunp.s3.amazonaws.com/1.0.0/sunp_parks/';
    path = base_url + (z) + '/' + (a.x * 1) + '/' + (a.y * 1)+ '.gif';
    return path;
    }


function setLayers(type, species) {
    //var curMapType =  sunpMap.getCurrentMapType().getName();
    //console.log(type,species)

    parksLayer= new GTileLayer(new GCopyrightCollection("SUNP Parks"),1,17);
    parksLayer.myLayers='sunp_parks';
    parksLayer.myFormat='png';
    parksLayer.myBaseURL= 'http://tc.activetools.org/wildfish/tilecache.py?';
    parksLayer.getTileUrl=S3Tile;
    parksLayer.getOpacity = function() {return 0.7;}

    
    coverLayer = new GTileLayer(new GCopyrightCollection(""),1,19);
    coverLayer.myFormat='image/gif';
    coverLayer.myLayers = 'cover';
    coverLayer.myBaseURL = ms_url + '&SPECIES=' + species + '&';
    coverLayer.getTileUrl=CustomGetTileUrl;
    coverLayer.getOpacity = function() {return 0.9;}

    
    summaryLayer = new GTileLayer(new GCopyrightCollection(""),1,19);
    summaryLayer.myFormat='image/gif';
    summaryLayer.myLayers = 'sunp_' + species;
    summaryLayer.myBaseURL= 'http://tc2.activetools.org/wildfish/tilecache.py?';
    summaryLayer.getTileUrl=CustomGetTileUrl;
    summaryLayer.getOpacity = function() {return 0.9;}

    
    if (type == 'habitat') {
        reqLayer = parksLayer;
        setHelpText(introHelpText);
        toggleLogo(0);
        }
    else if (type =='cover') {
        reqLayer = coverLayer;
        setHelpText(speciesHelpText);
        toggleLogo(1);
        }
    else if (type =='summary') {
        reqLayer = summaryLayer;
        setHelpText(summaryHelpText);
        toggleLogo(1);
        }
    else alert('invalid layer type chosen');
        

    var streetMap=[G_NORMAL_MAP.getTileLayers()[0], reqLayer, G_HYBRID_MAP.getTileLayers()[1]];
    var hybridMap = [G_SATELLITE_MAP.getTileLayers()[0], reqLayer, G_HYBRID_MAP.getTileLayers()[1]]; 
    var terrainMap = [G_PHYSICAL_MAP.getTileLayers()[0], reqLayer]; 
    
    streetMapType = new GMapType(streetMap, G_SATELLITE_MAP.getProjection(), "Streets", G_SATELLITE_MAP);
    hybridMapType = new GMapType(hybridMap, G_SATELLITE_MAP.getProjection(), "Satellite", G_SATELLITE_MAP);
    terrainMapType = new GMapType(terrainMap, G_SATELLITE_MAP.getProjection(), "Terrain", G_SATELLITE_MAP);

    sunpMap.removeMapType(sunpMap.getMapTypes()[0]);
    sunpMap.addMapType(streetMapType);
    sunpMap.removeMapType(sunpMap.getMapTypes()[0]);
    sunpMap.addMapType(hybridMapType);
    sunpMap.removeMapType(sunpMap.getMapTypes()[0]);
    sunpMap.addMapType(terrainMapType);
    
    streetMapType.getMinimumResolution = function () { return 9 }; 
    streetMapType.getMaximumResolution = function () { return 16 }; 
    hybridMapType.getMinimumResolution = function () { return 9 }; 
    hybridMapType.getMaximumResolution = function () { return 16 }; 
    terrainMapType.getMinimumResolution = function () { return 9 }; 
    terrainMapType.getMaximumResolution = function () { return 15 }; 
    
    
    if (type == 'habitat') {
        document.getElementById("sunpCoverQueryContainer").style.display = "none";
        document.getElementById("divSunpQueryResults").style.display = "block";
        }
    }
    
    
function updateResults(name, habitat, poly_id) {
    var sqr = document.getElementById('divSunpQueryResults');
    sqr.innerHTML = name + '<br><font size=small>Habitat: ' + habitat + '</font><br>';
    var pjs = 'javascript:getSpecies(' + "'" + 'poly' + "','" + poly_id + "'" + ');';
    sqr.innerHTML += '<a href="' + pjs + '">Display Polygon Species</a><br>'
    var pjs = 'javascript:getSpecies(' + "'" + 'park' + "','" + poly_id + "'" + ');';
    sqr.innerHTML += '<a href="' + pjs + '">Display Park Species</a>';
    // set species results infodiv
    document.getElementById('divSunpLinkResults').innerHTML = '';
    jQuery("#divSunpQueryResults").effect("highlight", { color:'#1D9F72' }, 1200);

    }
    

function displayLinkedInfo(json){
    test=json;
    coverDictionary = {1:"<1%",2:"1-5%",3:"5-10%",4:"10-25%",5:"25-50%",6:"50-75%",7:"75-95%",8:"95-100%"};
    
    html = '<span class=sclass_Yes>Native</span>,';
    html += '<span class=sclass_Invasive>Invasive</span>,';
    html += '<span class=sclass_No>Non-Native</span>,';
    html += '<span class=sclass_X>Unknown</span><br>';
    if (json[0].length > 3) {
        html += "<span class=cvclass>Values in parenthesis next to the scientific name represent percent cover</span><br>";
        }
    html += '------------------------'; 
    for (var i = 0; i < json.length; i++) {
        html += '<br><span class="sclass_' + json[i][2] + '">' + json[i][0] + '</span>';
        if (json[i][1]) {html += '<span class="isclass_' + json[i][2] + '"> (' + json[i][1] + ')</span>';}
        if (json[i].length > 3) {html += '<span class="cvclass"> ('  + coverDictionary[parseInt(json[i][3])] + ')</span>';}
        }
    document.getElementById('divSunpLinkResults').innerHTML = html;
    jQuery("#divSunpQueryResults").effect("highlight", { color:'#1D9F72' }, 1200);
    }

    
function getSpecies(type,poly_id) {
    if (type == 'park') {var url= qry_url + 'callback=displayLinkedInfo&parkspecies=' + poly_id;}
    if (type == 'poly') {var url= qry_url + 'callback=displayLinkedInfo&polyspecies=' + poly_id;}
    document.getElementById('divSunpLinkResults').innerHTML = 'loading results...';
    //console.log(url)
    var id = createScriptRequest(url);
    }
    
    
function processParkInfo(json){
        if (json.error){
            document.getElementById('divSunpLinkResults').innerHTML = '';
            document.getElementById('divSunpQueryResults').innerHTML = json.error;
            jQuery("#divSunpQueryResults").effect("highlight", { color:'#ff0000' }, 1400);
            return;
            }
        var parkname = json.parkname;
        var habitat = json.habitat;
        var polyid = json.poly_id;
        updateResults(parkname, habitat, polyid);
        var centroid = new GLatLng(json.y, json.x);
        parkCentroid = new GMarker(centroid);
        // ========= Now process the polylines ===========
        var pts = [];
        for (var i = 0; i < json.poly.length; i++) {
           pts[i] = new GLatLng(json.poly[i][1],json.poly[i][0]);
        }
        polyline = new GPolygon(pts,'#0A30D5',1,.5,'#0A30D5',.2);
        sunpMap.addOverlay(polyline);
        sunpMap.addOverlay(parkCentroid);
    }
    
function getParkInfo(y,x) {
    if (parkCentroid) {
        sunpMap.removeOverlay(polyline);
        sunpMap.removeOverlay(parkCentroid);
        }
    var url=qry_url + 'callback=processParkInfo&lat=' + y.toFixed(4) + '&lon=' + x.toFixed(4);
    sunpMap.panTo(new GLatLng(y,x));
    //console.log(url);
    var id = createScriptRequest(url);
    }
    
    
function toggleLogo(logo){
    if (logo) document.getElementById('divLogo').style.display = 'block';
    else document.getElementById('divLogo').style.display = 'none';
    }

function zoomToPark(val){
        var xy = val.split(',');
        if(xy.length == 2) {
            var pt = new GLatLng(xy[0], xy[1]);
            sunpMap.setCenter(pt, 16);
            var marker = new GMarker(pt);
            sunpMap.removeOverlay(polyline);
            sunpMap.removeOverlay(parkCentroid);
            sunpMap.addOverlay(marker);
        }
    }
    
function displayParksList(doc){
    parks = eval('(' + doc+ ')');
    var div = document.getElementById("divZoomToParkSelect");
    var html = '<select id="zoomToParkSelect" name="zoomToParkSelect" onchange="javascript:zoomToPark(this.value)">';
    for (x in parks) {
        park = parks[x];
        html += '<option value="' + park[1] + ',' + park[0] + '">' + park[2] + '</option>';
        }
    html += '</select>';
    div.innerHTML = html;
    }

//geocode address in the address form
function geocode() {
    var geocoder = new GClientGeocoder();
    var address=document.getElementById("formFieldAddressGeocoder").value;
    // hack - add seattle to address; this should do better zip parsing tho
    if ((address.search('seattle') + address.search(' 981')) + address.search ('Seattle') < 0) address += ', Seattle';
    document.getElementById("formFieldAddressGeocoder").value = address;
    geocoder.getLatLng(address,function(point) {
        if (!point) {alert(address + " not found");} 
        else {
            sunpMap.setCenter(point, 16);
            var marker = new GMarker(point);
            sunpMap.addOverlay(marker);
            marker.openInfoWindowHtml(address);
            }
            });
    }


