var map, zoom, keyboardnav, featureInfo, click, select, popup, kmlpopup, measureControls, nav, lonlat, ddlonlat, ddlat, ddlon, elevationvalue, filter;
var markers, mcd, col_index08, col_index03, cir_index03, zipcodes, school_districts, voting_districts, ag_districts, streets, water, dec_wetlands, nwi_wetlands, soils, parcels2009, parcelsHighlight, parcels, parcel_printkey_labels, parcel_owner_labels, parcel_address_labels, events, dynamickml;
var mcd_legend = "<br>Municipal Boundaries&nbsp;<img alt='legend' src='http://www.opengeohost.com:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&amp;FORMAT=image/png&amp;WIDTH=16&amp;HEIGHT=16&amp;TRANSPARENT=true&amp;LAYER=stlawrence:mcd' align='top'>";
var zipcodes_legend = "";
var school_districts_legend = "";
var voting_districts_legend = "";
var ag_districts_legend = "";
var water_legend = "";
var dec_wetlands_legend = "";
var nwi_wetlands_legend = "";
var soils_legend = "";
var parcels2009_legend = "";
var parcels_legend = "";
var cookietext, maplon, maplat, parcelslabel, mcdlabel;
var maxOpacity = 1.0;
var minOpacity = 0.1;
var imgformat = "image/png";
var lon = -75.06683;
var lat = 44.56112;
var mapzoom = 9;

// === Some cookie parameters ===
var cookiename = "mapinfo"; // name for this cookie
var expiredays = 7; // number of days before cookie expiry
// === Look for the cookie ===
if (document.cookie.length > 0) {
    cookieStart = document.cookie.indexOf(cookiename + "=");
    if (cookieStart != -1) {
        cookieStart += cookiename.length + 1;
        cookieEnd = document.cookie.indexOf(";", cookieStart);
        if (cookieEnd == -1) {
            cookieEnd = document.cookie.length;
        }
        cookietext = document.cookie.substring(cookieStart, cookieEnd);
        // == split the cookie text and create the variables ==
        bits = cookietext.split("|");
        lat = parseFloat(bits[0]);
        lon = parseFloat(bits[1]);
        mapzoom = parseInt(bits[2], 10);
    }
}

// === Set the cookie before exiting ===

function setCookie() {
    mapcenter = new OpenLayers.LonLat(map.getCenter().lon, map.getCenter().lat).transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));
    cookietext = cookiename + "=" + mapcenter.lat + "|" + mapcenter.lon + "|" + map.getZoom();
    if (expiredays) {
        var exdate = new Date();
        exdate.setDate(exdate.getDate() + expiredays);
        cookietext += ";expires=" + exdate.toGMTString();
    }
    // == write the cookie ==
    document.cookie = cookietext;
}

function switchtogif() {
    imgformat = "image/gif";
}

// BEGIN URL VARIABLE CODE //

function getUrlVars() {
    var urlvar = {};
    var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function (m, key, value) {
        urlvar[key] = value;
    });
    map.setCenter(new OpenLayers.LonLat(urlvar['maplon'], urlvar['maplat']).transform(new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913")), urlvar['mapzoom']);
    return urlvar;
}
// END URL VARIABLE CODE //
// Begin USGS Elevation

function loadXMLDoc(dname) {
    if (window.XMLHttpRequest) {
        xhttp = new XMLHttpRequest();
    } else {
        xhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xhttp.open("GET", dname, false);
    xhttp.send("");
    return xhttp.responseXML;
}

OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, {
    defaultHandlerOptions: {
        'single': true,
        'double': false,
        'pixelTolerance': 0,
        'stopSingle': false,
        'stopDouble': false
    },

    initialize: function (options) {
        this.handlerOptions = OpenLayers.Util.extend({}, this.defaultHandlerOptions);
        OpenLayers.Control.prototype.initialize.apply(
        this, arguments);
        this.handler = new OpenLayers.Handler.Click(
        this, {
            'click': this.trigger
        }, this.handlerOptions);
    },

    trigger: function (e) {
        var lonlat = map.getLonLatFromViewPortPx(e.xy).transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));

        xml = loadXMLDoc("http://www.opengeohost.com/JavaBridge/kml/usgs_elevation/getElevation.php?x=" + lonlat.lon + "&y=" + lonlat.lat);
        xsl = loadXMLDoc("http://www.opengeohost.com/JavaBridge/kml/usgs_elevation/getElevation.xsl");
        // code for IE
        if (window.ActiveXObject) {
            ex = xml.transformNode(xsl);
            document.getElementById("elevation").innerHTML = "";
            document.getElementById("elevation").innerHTML = ex;
        }
        // code for Mozilla, Firefox, Opera, etc.
        else if (document.implementation && document.implementation.createDocument) {
            xsltProcessor = new XSLTProcessor();
            xsltProcessor.importStylesheet(xsl);
            resultDocument = xsltProcessor.transformToFragment(xml, document);
            document.getElementById("elevation").innerHTML = "";
            document.getElementById("elevation").appendChild(resultDocument);
        }

/*alert("You clicked near " + Math.round(lonlat.lat*100000)/100000 + " N, " +
                                              + Math.round(lonlat.lon*100000)/100000 + " E");*/
    }

});
// End USGS Elevation
OpenLayers.Lang.en = {
    'unhandledRequest': "Unhandled request return ${statusText}",
    'permalink': "Permalink",
    'overlays': "<u><b>MAP OVERLAYS</b></u><br><br>",
    'baseLayer': "<b>Base Layers</b><br>",
    'sameProjection': "The overview map only works when it is in the same projection as the main map",
    'readNotImplemented': "Read not implemented.",
    'writeNotImplemented': "Write not implemented.",
    'noFID': "Can't update a feature for which there is no FID.",
    'errorLoadingGML': "Error in loading GML file ${url}",
    'browserNotSupported': "Your browser does not support vector rendering. Currently supported renderers are:\n${renderers}",
    'componentShouldBe': "addFeatures : component should be an ${geomType}",
    'getFeatureError': "getFeatureFromEvent called on layer with no renderer. This usually means you " + "destroyed a layer, but not some handler which is associated with it.",
    'minZoomLevelError': "The minZoomLevel property is only intended for use " + "with the FixedZoomLevels-descendent layers. That this " + "wfs layer checks for minZoomLevel is a relic of the" + "past. We cannot, however, remove it without possibly " + "breaking OL based applications that may depend on it." + " Therefore we are deprecating it -- the minZoomLevel " + "check below will be removed at 3.0. Please instead " + "use min/max resolution setting as described here: " + "http://trac.openlayers.org/wiki/SettingZoomLevels",
    'commitSuccess': "WFS Transaction: SUCCESS ${response}",
    'commitFailed': "WFS Transaction: FAILED ${response}",
    'googleWarning': "The Google Layer was unable to load correctly.<br><br>" + "To get rid of this message, select a new BaseLayer " + "in the layer switcher in the upper-right corner.<br><br>" + "Most likely, this is because the Google Maps library " + "script was either not included, or does not contain the " + "correct API key for your site.<br><br>" + "Developers: For help getting this working correctly, " + "<a href='http://trac.openlayers.org/wiki/Google' " + "target='_blank'>click here</a>",
    'getLayerWarning': "The ${layerType} Layer was unable to load correctly.<br><br>" + "To get rid of this message, select a new BaseLayer " + "in the layer switcher in the upper-right corner.<br><br>" + "Most likely, this is because the ${layerLib} library " + "script was not correctly included.<br><br>" + "Developers: For help getting this working correctly, " + "<a href='http://trac.openlayers.org/wiki/${layerLib}' " + "target='_blank'>click here</a>",
    'scale': "Scale = 1 : ${scaleDenom}",
    'layerAlreadyAdded': "You tried to add the layer: ${layerName} to the map, but it has already been added",
    'reprojectDeprecated': "You are using the 'reproject' option " + "on the ${layerName} layer. This option is deprecated: " + "its use was designed to support displaying data over commercial " + "basemaps, but that functionality should now be achieved by using " + "Spherical Mercator support. More information is available from " + "http://trac.openlayers.org/wiki/SphericalMercator.",
    'methodDeprecated': "This method has been deprecated and will be removed in 3.0. " + "Please use ${newMethod} instead.",
    'boundsAddError': "You must pass both x and y values to the add function.",
    'lonlatAddError': "You must pass both lon and lat values to the add function.",
    'pixelAddError': "You must pass both x and y values to the add function.",
    'unsupportedGeometryType': "Unsupported geometry type: ${geomType}",
    'pagePositionFailed': "OpenLayers.Util.pagePosition failed: element with id ${elemId} may be misplaced.",
    'end': '',
    'filterEvaluateNotImplemented': "evaluate is not implemented for this filter type.",
    'scale': "1 : ${scaleDenom}"
};

function load() {
    OpenLayers.IMAGE_RELOAD_ATTEMPTS = 3;
    OpenLayers.Util.onImageLoadErrorColor = "transparent";


    var options = {
        maxExtent: new OpenLayers.Bounds(-75.86, 44.05, -74.526, 45.016).transform(new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913")),
        //maxResolution: 364.20348058008676,
        maxResolution: "auto",
        projection: new OpenLayers.Projection("EPSG:900913"),
        displayProjection: new OpenLayers.Projection("EPSG:4326"),
        googleprojection: new OpenLayers.Projection("EPSG:900913"),
        units: 'm'
    };


    map = new OpenLayers.Map('map', options);
    //map.fractionalZoom = true;
    click = new OpenLayers.Control.Click();
    map.addControl(click);
    //click.activate();
    // Google Mercator layers
    var gmap = new OpenLayers.Layer.Google(" Google Streets", {
        numZoomLevels: 22
    });
    var gsat = new OpenLayers.Layer.Google(" Google Imagery", {
        type: google.maps.MapTypeId.SATELLITE,
        /*G_SATELLITE_MAP, 'sphericalMercator': true,*/
        numZoomLevels: 22
    });
    var ghyb = new OpenLayers.Layer.Google(" Google Hybrid", {
        type: google.maps.MapTypeId.HYBRID,
        /*G_HYBRID_MAP, 'sphericalMercator': true,*/
        numZoomLevels: 22
    });
    var gphy = new OpenLayers.Layer.Google(" Google Terrain", {
        type: google.maps.MapTypeId.TERRAIN,
        /*G_PHYSICAL_MAP, 'sphericalMercator': true,*/
        numZoomLevels: 22
    });

    // Bing layers
    var bingmap = new OpenLayers.Layer.VirtualEarth(" Bing Streets", {
        type: VEMapStyle.Road,
        sphericalMercator: true,
        numZoomLevels: 22
    });
    var bingsat = new OpenLayers.Layer.VirtualEarth(" Bing Imagery", {
        type: VEMapStyle.Aerial,
        sphericalMercator: true,
        numZoomLevels: 22
    });
    var binghyb = new OpenLayers.Layer.VirtualEarth(" Bing Hybrid", {
        type: VEMapStyle.Hybrid,
        sphericalMercator: true,
        numZoomLevels: 22
    });

    // Yahoo layers
    var yahoo = new OpenLayers.Layer.Yahoo(" Yahoo Streets", {
        sphericalMercator: true,
        numZoomLevels: 22
    });
    var yahoosat = new OpenLayers.Layer.Yahoo(" Yahoo Imagery", {
        type: YAHOO_MAP_SAT,
        sphericalMercator: true,
        numZoomLevels: 22
    });
    var yahoohyb = new OpenLayers.Layer.Yahoo(" Yahoo Hybrid", {
        type: YAHOO_MAP_HYB,
        sphericalMercator: true,
        numZoomLevels: 22
    });

    // OSM layer
    var mapnik = new OpenLayers.Layer.OSM(" OpenStreetMap", "", {
        numZoomLevels: 22
    });

    // Cloudemade layer
    var cloudmade = new OpenLayers.Layer.CloudMade(" CloudeMade OSM", {
        key: '3bfac998ee2140478704f074b1ebc6db',
        styleId: 2666
    });

    // Blank Base layer
    var nobase = new OpenLayers.Layer(" <i>No Basemap</i>", {
        isBaseLayer: true,
        displayInLayerSwitcher: true
    });

    // ESRI ArcGIS Online layers
    var ESRI_streetmap = new OpenLayers.Layer.ArcGIS93Rest(" ESRI Streets", "http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/export", {
        format: imgformat
    });

    var ESRI_imagery = new OpenLayers.Layer.ArcGIS93Rest(" ESRI Imagery", "http://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/export", {
        format: imgformat
    });

    var ESRI_topo = new OpenLayers.Layer.ArcGIS93Rest(" ESRI Topo", "http://services.arcgisonline.com/ArcGIS/rest/services/USA_Topo_Maps/MapServer/export", {
        layers: 'show:0',
        format: imgformat
    });

    // USGS layers 
    var USGS_topo = new OpenLayers.Layer.ArcGIS93Rest(" USGS 24K Topo", "http://raster.nationalmap.gov/ArcGIS/rest/services/DRG/TNM_Digital_Raster_Graphics/MapServer/export", {
        layers: 'show:4',
        format: imgformat
    });

    var USGS_imagery = new OpenLayers.Layer.ArcGIS93Rest(" USGS 1 Meter NAIP Imagery", "http://raster.nationalmap.gov/ArcGIS/rest/services/Combined/TNM_Large_Scale_Imagery/MapServer/export", {
        layers: 'show:0',
        format: imgformat
    });

    // Override OL getFullRequestString to allow layer with a different CRS code
    OpenLayers.Layer.WMS.prototype.getFullRequestString =

    function (newParams, altUrl) {
        var projectionCode = this.projection.toString();
        this.params.SRS = (projectionCode == "none") ? null : "EPSG:102113";
        return OpenLayers.Layer.Grid.prototype.getFullRequestString.apply(
        this, arguments);
    };

    var NYSDOP = new OpenLayers.Layer.WMS(" NYS Orthoimagery (NYSDOP)", "http://imsortho.cr.usgs.gov/servlet/com.esri.wms.Esrimap/USGS_EDC_Ortho_NYSDOP_Grid?", {
        layers: 'NY_EAST_2003_2FT_CIR_1,NY_EAST_2008_6IN_NC',
        transparent: true,
        format: imgformat
    }, {
        isBaseLayer: true,
        singleTile: true,
        ratio: 1,
        visibility: false
    });



    map.events.register('click', map, function (e) {
        mouseLoc = map.getLonLatFromPixel(e.xy);
        //OpenLayers.Event.stop(e);
    });

    var urlArray = ["http://www.opengeohost.com:80/geoserver/wms", "http://geohost.s42.eatj.com:80/geoserver/wms"];
    var wmsUrl = "http://www.opengeohost.com:80/geoserver/wms";


    mcd = new OpenLayers.Layer.WMS("Town Boundaries", urlArray, {
        layers: 'stlawrence:mcd',
        transparent: true,
        format: imgformat
    }, {
        isBaseLayer: false,
        singleTile: true,
        transitionEffect: 'resize',
        ratio: 1,
        maxScale: 50000,
        minScale: 444000000,
        visibility: true,
        displayInLayerSwitcher: false
    });

    col_index08 = new OpenLayers.Layer.WMS('2008 NYSDOP 6" COL Index', urlArray, {
        layers: 'nys:stlaw_sp_4bd_06in_index08',
        transparent: true,
        format: imgformat
    }, {
        isBaseLayer: false,
        singleTile: true,
        transitionEffect: 'resize',
        ratio: 1,
        visibility: false,
        displayInLayerSwitcher: false
    });

    col_index03 = new OpenLayers.Layer.WMS('2003 NYSDOP 12" COL Index', urlArray, {
        layers: 'nys:stl_sp_col_index03',
        transparent: true,
        format: imgformat
    }, {
        isBaseLayer: false,
        singleTile: true,
        transitionEffect: 'resize',
        ratio: 1,
        visibility: false,
        displayInLayerSwitcher: false
    });

    cir_index03 = new OpenLayers.Layer.WMS('2003 NYSDOP 24" CIR Index', urlArray, {
        layers: 'nys:stl_sp_cir_index03',
        transparent: true,
        format: imgformat
    }, {
        isBaseLayer: false,
        singleTile: true,
        transitionEffect: 'resize',
        ratio: 1,
        visibility: false,
        displayInLayerSwitcher: false
    });

    school_districts = new OpenLayers.Layer.WMS("School Districts", urlArray, {
        layers: 'stlawrence:school_district',
        transparent: true,
        format: imgformat
    }, {
        isBaseLayer: false,
        singleTile: true,
        transitionEffect: 'resize',
        ratio: 1,
        visibility: false,
        displayInLayerSwitcher: false
    });

    voting_districts = new OpenLayers.Layer.WMS("Voting Districts", urlArray, {
        layers: 'stlawrence:voting_districts',
        transparent: true,
        format: imgformat
    }, {
        isBaseLayer: false,
        singleTile: true,
        transitionEffect: 'resize',
        ratio: 1,
        visibility: false,
        displayInLayerSwitcher: false
    });

    zipcodes = new OpenLayers.Layer.WMS("Zip Code Boundaries", urlArray, {
        layers: 'stlawrence:zipcodes',
        transparent: true,
        format: imgformat
    }, {
        isBaseLayer: false,
        singleTile: true,
        transitionEffect: 'resize',
        ratio: 1,
        visibility: false,
        displayInLayerSwitcher: false
    });

    ag_districts = new OpenLayers.Layer.WMS("Agricultural Districts", urlArray, {
        layers: 'stlawrence:ag_districts',
        transparent: true,
        format: imgformat
    }, {
        isBaseLayer: false,
        singleTile: true,
        transitionEffect: 'resize',
        ratio: 1,
        visibility: false,
        displayInLayerSwitcher: false
    });

    streets = new OpenLayers.Layer.WMS("Streets", urlArray, {
        layers: 'stlawrence:roads',
        transparent: true,
        format: imgformat
    }, {
        isBaseLayer: false,
        singleTile: true,
        transitionEffect: 'resize',
        ratio: 1,
        visibility: false,
        displayInLayerSwitcher: false
    });

    water = new OpenLayers.Layer.WMS("Water", urlArray, {
        layers: 'stlawrence:water',
        transparent: true,
        format: imgformat
    }, {
        isBaseLayer: false,
        singleTile: true,
        transitionEffect: 'resize',
        ratio: 1,
        visibility: false,
        displayInLayerSwitcher: false
    });

    nwi_wetlands = new OpenLayers.Layer.WMS("Federal Wetlands", urlArray, {
        layers: 'stlawrence:nwi_wetlands',
        transparent: true,
        format: imgformat
    }, {
        isBaseLayer: false,
        singleTile: true,
        transitionEffect: 'resize',
        ratio: 1,
        visibility: false,
        opacity: 1.0,
        displayInLayerSwitcher: false
    });


    dec_wetlands = new OpenLayers.Layer.WMS("DEC Wetlands", urlArray, {
        layers: 'stlawrence:dec_wetlands',
        transparent: true,
        format: imgformat
    }, {
        isBaseLayer: false,
        singleTile: true,
        transitionEffect: 'resize',
        ratio: 1,
        visibility: false,
        opacity: 1.0,
        displayInLayerSwitcher: false
    });

    soils = new OpenLayers.Layer.WMS("Soils", urlArray, {
        layers: 'stlawrence:soils',
        transparent: true,
        format: imgformat
    }, {
        isBaseLayer: false,
        singleTile: true,
        transitionEffect: 'resize',
        ratio: 1,
        visibility: false,
        opacity: 0.5,
        displayInLayerSwitcher: false
    });

    parcels2009 = new OpenLayers.Layer.WMS("Tax Parcels", urlArray, {
        layers: 'stlawrence:parcels2009',
        transparent: true,
        format: imgformat
    }, {
        isBaseLayer: false,
        singleTile: true,
        transitionEffect: 'resize',
        ratio: 1,
        visibility: false,
        displayInLayerSwitcher: false
    });

    parcelsHighlight = new OpenLayers.Layer.WMS("Selected Parcel", wmsUrl, {
        layers: 'stlawrence:parcels2010',
        transparent: true,
        format: imgformat,
        styles: 'highlighted_parcels'
    }, {
        isBaseLayer: false,
        singleTile: true,
        transitionEffect: 'resize',
        ratio: 1,
        visibility: false,
        displayInLayerSwitcher: false
    });

    parcel_printkey_labels = new OpenLayers.Layer.WMS("Tax Parcel Printkey Labels", 'http://geohost.s42.eatj.com:80/geoserver/wms', {
        layers: 'stlawrence:parcels2010',
        transparent: true,
        format: imgformat,
        styles: 'tax_parcel_printkey_labels'
    }, {
        isBaseLayer: false,
        singleTile: true,
        transitionEffect: 'resize',
        ratio: 1,
        visibility: false,
        displayInLayerSwitcher: false
    });

    parcel_owner_labels = new OpenLayers.Layer.WMS("Tax Parcel Owner Labels", 'http://geohost.s42.eatj.com:80/geoserver/wms', {
        layers: 'stlawrence:parcels2010',
        transparent: true,
        format: imgformat,
        styles: 'tax_parcel_owner_labels'
    }, {
        isBaseLayer: false,
        singleTile: true,
        transitionEffect: 'resize',
        ratio: 1,
        visibility: false,
        displayInLayerSwitcher: false
    });

    parcel_address_labels = new OpenLayers.Layer.WMS("Tax Parcel Address Labels", 'http://geohost.s42.eatj.com:80/geoserver/wms', {
        layers: 'stlawrence:parcels2010',
        transparent: true,
        format: imgformat,
        styles: 'tax_parcel_address_labels'
    }, {
        isBaseLayer: false,
        singleTile: true,
        transitionEffect: 'resize',
        ratio: 1,
        visibility: false,
        displayInLayerSwitcher: false
    });

    parcels = new OpenLayers.Layer.WMS("Tax Parcels", urlArray, {
        layers: 'stlawrence:parcels2010',
        transparent: true,
        format: imgformat
    }, {
        isBaseLayer: false,
        singleTile: true,
        transitionEffect: 'resize',
        ratio: 1,
        visibility: false,
        displayInLayerSwitcher: false
    });

    events = new OpenLayers.Layer.WMS("Events", urlArray, {
        layers: 'stlawrence:slc_events',
        transparent: true,
        format: imgformat
    }, {
        isBaseLayer: false,
        singleTile: true,
        transitionEffect: 'resize',
        ratio: 1,
        visibility: false,
        displayInLayerSwitcher: false
    });

    dynamickml = new OpenLayers.Layer.Vector("&nbsp;User KML", {
        projection: map.displayProjection,
        strategies: [new OpenLayers.Strategy.Fixed()],
        displayInLayerSwitcher: false,
        visibility: true,
        protocol: new OpenLayers.Protocol.HTTP({
            url: "http://www.opengeohost.com/JavaBridge/kml/dynamickml.php?",
            format: new OpenLayers.Format.KML({
                extractStyles: true,
                extractAttributes: true
            })
        })
    });
    select = new OpenLayers.Control.SelectFeature(dynamickml);

    dynamickml.events.on({
        "featureselected": onFeatureSelect,
        "featureunselected": onFeatureUnselect
    });

    map.addControl(select);
    //select.activate();

    function onPopupClose(evt) {
        select.unselectAll();
    }

    function onFeatureSelect(event) {
        var feature = event.feature;
        var selectedFeature = feature;
        kmlpopup = new OpenLayers.Popup.FramedCloud("chicken", feature.geometry.getBounds().getCenterLonLat(), new OpenLayers.Size(100, 100), '<h2>' + feature.attributes.name + '</h2>' + feature.attributes.description, null, true, onPopupClose);
        feature.popup = kmlpopup;
        map.addPopup(kmlpopup);
    }

    function onFeatureUnselect(event) {
        var feature = event.feature;
        if (feature.popup) {
            map.removePopup(feature.popup);
            feature.popup.destroy();
            delete feature.popup;
        }
    }

    map.addLayers([gmap, ghyb, gsat, gphy, bingmap, binghyb, bingsat, yahoo, yahoohyb, yahoosat, mapnik, cloudmade, ESRI_streetmap, ESRI_imagery, USGS_topo, USGS_imagery, NYSDOP, nobase, soils, water, streets, parcels2009, parcels, parcelsHighlight, parcel_printkey_labels, parcel_owner_labels, parcel_address_labels, nwi_wetlands, dec_wetlands, cir_index03, col_index03, col_index08, ag_districts, voting_districts, school_districts, zipcodes, mcd, events]);

    featureInfo = new OpenLayers.Control.WMSGetFeatureInfo({
        url: 'http://www.opengeohost.com:80/geoserver/wms',
        title: 'Identify features by clicking',
        layers: [events, mcd, zipcodes, school_districts, voting_districts, ag_districts, col_index08, col_index03, cir_index03, dec_wetlands, nwi_wetlands, parcels, parcels2009, streets, water, soils],
        queryVisible: true
    });
    featureInfo.events.on({
        getfeatureinfo: function (e) {
            new GeoExt.Popup({
                title: "Feature Info",
                width: 250,
                height: 250,
                autoScroll: true,
                maximizable: true,
                collapsible: true,
                map: map,
                lonlat: map.getLonLatFromPixel(e.xy),
                html: e.text
            }).show();
        }
    });
    map.addControl(featureInfo);
    //featureInfo.activate();
    // BEGIN LAYER SWITCHER CODE //
/*map.addControl(new OpenLayers.Control.LayerSwitcher({'ascending':false}));
		var ls = map.getControlsByClass('OpenLayers.Control.LayerSwitcher')[0];
		ls.maximizeControl(); */
    // END LAYER SWITCHER CODE //
    //map.addControl(new OpenLayers.Control.Permalink());
    map.addControl(new OpenLayers.Control.LoadingPanel( /*{'div':OpenLayers.Util.getElement('loadingpanel')}*/ ));
    map.addControl(new OpenLayers.Control.MousePosition({
        'div': OpenLayers.Util.getElement('coords')
    }));
    map.addControl(new OpenLayers.Control.Scale($('scale')));
    //map.addControl(new OpenLayers.Control.ScaleLine({'div':OpenLayers.Util.getElement('scaleline')}));
    keyboardnav = new OpenLayers.Control.KeyboardDefaults();
    map.addControl(keyboardnav);
    zoom = new OpenLayers.Control.ZoomBox({
        alwaysZoom: true
    });
    map.addControl(zoom);
    map.addControl(new OpenLayers.Control.LayerSwitcher({
        'div': OpenLayers.Util.getElement('layerswitcher')
    }));
    //map.addControl(new OpenLayers.Control.MouseToolbar());
    //map.zoomToExtent(new OpenLayers.Bounds(-76.05971168,44.0021275,-74.32601832,45.0641225).transform(map.displayProjection, map.googleprojection));
    map.setCenter(new OpenLayers.LonLat(lon, lat).transform(map.displayProjection, map.googleprojection), mapzoom);
    OpenLayers.Util.onImageLoadErrorColor = "transparent";

    // MEASURE CODE
    // style the sketch fancy
    var sketchSymbolizers = {
        "Point": {
            pointRadius: 4,
            graphicName: "square",
            fillColor: "white",
            fillOpacity: 1,
            strokeWidth: 1,
            strokeOpacity: 1,
            strokeColor: "#333333"
        },
        "Line": {
            strokeWidth: 3,
            strokeOpacity: 1,
            strokeColor: "red",
            strokeDashstyle: "dash"
        },
        "Polygon": {
            strokeWidth: 2,
            strokeOpacity: 1,
            strokeColor: "red",
            fillColor: "red",
            fillOpacity: 0.3
        }
    };
    var style = new OpenLayers.Style();
    style.addRules([
    new OpenLayers.Rule({
        symbolizer: sketchSymbolizers
    })]);
    var styleMap = new OpenLayers.StyleMap({
        "default": style
    });


    line = new OpenLayers.Control.Measure(
    OpenLayers.Handler.Path, {
        displaySystem: 'english',
        geodesic: true,
        persist: true,
        handlerOptions: {
            layerOptions: {
                styleMap: styleMap
            }
        }
    });

    line.events.on({
        "measure": handleMeasurements,
        "measurepartial": handleMeasurements
    });

    map.addControl(line);
    //line.activate();
    polygon = new OpenLayers.Control.Measure(
    OpenLayers.Handler.Polygon, {
        displaySystem: 'english',
        geodesic: true,
        persist: true,
        handlerOptions: {
            layerOptions: {
                styleMap: styleMap
            }
        }
    });

    polygon.events.on({
        "measure": handleMeasurements,
        "measurepartial": handleMeasurements
    });

    map.addControl(polygon);
    //polygon.activate();
    // END MEASURE CODE
    // BEGIN SCALE THRESHOLD CODE   
/*map.events.register('zoomend', this, function() { 
			if (map.getScale() > 30000)
			{
			document.getElementById("parcels").disabled = true;
			parcelslabel = document.getElementById("parcelslabel");
			parcelslabel.style.color = "gray";
			parcelslabel.style.fontStyle = "italic";
			}
			if (map.getScale() < 50000)
			{
			document.getElementById("mcd").disabled = true;
			mcdlabel = document.getElementById("mcdlabel");
			mcdlabel.style.color = "gray";
			mcdlabel.style.fontStyle = "italic";
			}
			if (map.getScale() < 30000)
			{
			document.getElementById("parcels").disabled = false;
			parcelslabel = document.getElementById("parcelslabel");
			parcelslabel.style.color = "black";
			parcelslabel.style.fontStyle = "normal";
			}
			if (map.getScale() > 50000)
			{
			document.getElementById("mcd").disabled = false;
			mcdlabel = document.getElementById("mcdlabel");
			mcdlabel.style.color = "black";
			mcdlabel.style.fontStyle = "normal";
			}
			});
			
			// INITIALIZE LAYER STATE ON STARTUP
			if (map.getScale() > 30000)
			{
			document.getElementById("parcels").disabled = true;
			parcelslabel = document.getElementById("parcelslabel");
			parcelslabel.style.color = "gray";
			parcelslabel.style.fontStyle = "italic";
			}
			if (map.getScale() < 50000)
			{
			document.getElementById("mcd").disabled = true;
			mcdlabel = document.getElementById("mcdlabel");
			mcdlabel.style.color = "gray";
			mcdlabel.style.fontStyle = "italic";
			}
			if (map.getScale() < 30000)
			{
			document.getElementById("parcels").disabled = false;
			parcelslabel = document.getElementById("parcelslabel");
			parcelslabel.style.color = "black";
			parcelslabel.style.fontStyle = "normal";
			}
			if (map.getScale() > 50000)
			{
			document.getElementById("mcd").disabled = false;
			mcdlabel = document.getElementById("mcdlabel");
			mcdlabel.style.color = "black";
			mcdlabel.style.fontStyle = "normal";
			}*/
    // END SCALE THRESHOLD CODE
    getUrlVars();
}

// BEGIN MEASURE CODE

function handleMeasurements(event) {
    var geometry = event.geometry;
    var units = event.units;
    var order = event.order;
    var measure = event.measure;
    var element = document.getElementById('output');
    var out = "";
    if (order == 1) {
        out += measure.toFixed(3) + " " + units;
    } else {
        out += measure.toFixed(3) + " " + units + "<sup>2</" + "sup>";
    }
    element.innerHTML = out;
}
// END MEASURE CODE

function showInfo(evt) {
    $('responseText').innerHTML = evt.text;

    var popup_info = evt.text;
    if (popup !== null) {
        popup.destroy();
        popup = null;
    }
    popup = new OpenLayers.Popup.FramedCloud("SDVegetationInfo", mouseLoc, new OpenLayers.Size(250, 120), popup_info, null, true);
    popup.autoSize = true;
    popup.maxSize = new OpenLayers.Size(400, 250);
    popup.setBackgroundColor("#bcd2ee");
    //popup.setOpacity(.95);
    map.addPopup(popup);
    popup.events.register("click", map, popupDestroy);
}

function popupDestroy(e) {
    popup.destroy();
    popup = null;
    OpenLayers.Util.safeStopPropagation(e);
}

function change_ag_districts_opacity(byOpacity) {
    var ag_districts_opacity = (parseFloat(OpenLayers.Util.getElement('ag_districts_opacity').value) + byOpacity).toFixed(1);
    ag_districts_opacity = Math.min(maxOpacity, Math.max(minOpacity, ag_districts_opacity));
    OpenLayers.Util.getElement('ag_districts_opacity').value = ag_districts_opacity;
    ag_districts.setOpacity(ag_districts_opacity);
}

function change_nwi_wetlands_opacity(byOpacity) {
    var nwi_wetlands_opacity = (parseFloat(OpenLayers.Util.getElement('nwi_wetlands_opacity').value) + byOpacity).toFixed(1);
    nwi_wetlands_opacity = Math.min(maxOpacity, Math.max(minOpacity, nwi_wetlands_opacity));
    OpenLayers.Util.getElement('nwi_wetlands_opacity').value = nwi_wetlands_opacity;
    nwi_wetlands.setOpacity(nwi_wetlands_opacity);
}

function change_dec_wetlands_opacity(byOpacity) {
    var dec_wetlands_opacity = (parseFloat(OpenLayers.Util.getElement('dec_wetlands_opacity').value) + byOpacity).toFixed(1);
    dec_wetlands_opacity = Math.min(maxOpacity, Math.max(minOpacity, dec_wetlands_opacity));
    OpenLayers.Util.getElement('dec_wetlands_opacity').value = dec_wetlands_opacity;
    dec_wetlands.setOpacity(dec_wetlands_opacity);
}

function change_soils_opacity(byOpacity) {
    var soils_opacity = (parseFloat(OpenLayers.Util.getElement('soils_opacity').value) + byOpacity).toFixed(1);
    soils_opacity = Math.min(maxOpacity, Math.max(minOpacity, soils_opacity));
    OpenLayers.Util.getElement('soils_opacity').value = soils_opacity;
    soils.setOpacity(soils_opacity);
}

function GetSelectedItem() {

    chosen = "";
    len = document.parcel_labels.r1.length;

    for (i = 0; i < len; i++) {
        if (document.parcel_labels.r1[i].checked) {
            chosen = document.parcel_labels.r1[i].value;
        }
    }

    if (chosen == "ID") {
        parcel_printkey_labels.setVisibility(true);
        parcel_owner_labels.setVisibility(false);
        parcel_address_labels.setVisibility(false);
    }
    if (chosen == "Owner") {
        parcel_printkey_labels.setVisibility(false);
        parcel_owner_labels.setVisibility(true);
        parcel_address_labels.setVisibility(false);
    }
    if (chosen == "Address") {
        parcel_printkey_labels.setVisibility(false);
        parcel_owner_labels.setVisibility(false);
        parcel_address_labels.setVisibility(true);
    }
    if (chosen == "None") {
        parcel_printkey_labels.setVisibility(false);
        parcel_owner_labels.setVisibility(false);
        parcel_address_labels.setVisibility(false);
    }
}

function toggle_mcd() {
    if (mcd.getVisibility() === true) {
        mcd.setVisibility(false);
        mcd_legend = "";
    } else {
        mcd.setVisibility(true);
        mcd_legend = "<br>Municipal Boundaries&nbsp;<img alt='' src='http://www.opengeohost.com:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&amp;FORMAT=image/png&amp;WIDTH=16&amp;HEIGHT=16&amp;TRANSPARENT=true&amp;LAYER=stlawrence:mcd' align='top'>";
    }
}

function toggle_events() {
    if (events.getVisibility() === true) {
        events.setVisibility(false);
    } else {
        events.setVisibility(true);
    }
}

function toggle_dynamickml() {
    if (dynamickml.getVisibility() === true) {
        dynamickml.setVisibility(false);
    } else {
        dynamickml.setVisibility(true);
    }
}

function toggle_col_index08() {
    if (col_index08.getVisibility() === true) {
        col_index08.setVisibility(false);
    } else {
        col_index08.setVisibility(true);
    }
}

function toggle_col_index03() {
    if (col_index03.getVisibility() === true) {
        col_index03.setVisibility(false);
    } else {
        col_index03.setVisibility(true);
    }
}

function toggle_cir_index03() {
    if (cir_index03.getVisibility() === true) {
        cir_index03.setVisibility(false);
    } else {
        cir_index03.setVisibility(true);
    }
}

function toggle_zipcodes() {
    if (zipcodes.getVisibility() === true) {
        zipcodes.setVisibility(false);
        zipcodes_legend = "";
    } else {
        zipcodes.setVisibility(true);
        zipcodes_legend = "<br>Voting Districts&nbsp;<img alt='' src='http://www.opengeohost.com:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&amp;FORMAT=image/png&amp;WIDTH=16&amp;HEIGHT=16&amp;TRANSPARENT=true&amp;LAYER=stlawrence:zipcodes' align='top'>";
    }
}

function toggle_school_districts() {
    if (school_districts.getVisibility() === true) {
        school_districts.setVisibility(false);
        school_districts_legend = "";
    } else {
        school_districts.setVisibility(true);
        school_districts_legend = "<br>School Districts&nbsp;<img alt='' src='http://www.opengeohost.com:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&amp;FORMAT=image/png&amp;WIDTH=16&amp;HEIGHT=16&amp;TRANSPARENT=true&amp;LAYER=stlawrence:school_district' align='top'>";
    }
}

function toggle_voting_districts() {
    if (voting_districts.getVisibility() === true) {
        voting_districts.setVisibility(false);
        voting_districts_legend = "";
    } else {
        voting_districts.setVisibility(true);
        voting_districts_legend = "<br>Voting Districts&nbsp;<img alt='' src='http://www.opengeohost.com:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&amp;FORMAT=image/png&amp;WIDTH=16&amp;HEIGHT=16&amp;TRANSPARENT=true&amp;LAYER=stlawrence:voting_districts' align='top'>";
    }
}

function toggle_ag_districts() {
    if (ag_districts.getVisibility() === true) {
        ag_districts.setVisibility(false);
        ag_districts_legend = "";
    } else {
        ag_districts.setVisibility(true);
        ag_districts_legend = "<br>Agricultural Districts&nbsp;<img alt='' src='http://www.opengeohost.com:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&amp;FORMAT=image/png&amp;WIDTH=16&amp;HEIGHT=16&amp;TRANSPARENT=true&amp;LAYER=stlawrence:ag_districts' align='top'>";
    }
}

function toggle_streets() {
    if (streets.getVisibility() === true) {
        streets.setVisibility(false);
    } else {
        streets.setVisibility(true);
    }
}

function toggle_water() {
    if (water.getVisibility() === true) {
        water.setVisibility(false);
        water_legend = "";
    } else {
        water.setVisibility(true);
        water_legend = "<br>Water Features&nbsp;<img alt='' src='http://www.opengeohost.com:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&amp;FORMAT=image/png&amp;WIDTH=16&amp;HEIGHT=16&amp;TRANSPARENT=true&amp;LAYER=stlawrence:water' align='top'>";
    }
}

function toggle_nwi_wetlands() {
    if (nwi_wetlands.getVisibility() === true) {
        nwi_wetlands.setVisibility(false);
        nwi_wetlands_legend = "";
    } else {
        nwi_wetlands.setVisibility(true);
        nwi_wetlands_legend = "<br>NWI Wetlands&nbsp;<img alt='' src='http://www.opengeohost.com:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&amp;FORMAT=image/png&amp;WIDTH=16&amp;HEIGHT=16&amp;TRANSPARENT=true&amp;LAYER=stlawrence:nwi_wetlands' align='top'>";
    }
}

function toggle_dec_wetlands() {
    if (dec_wetlands.getVisibility() === true) {
        dec_wetlands.setVisibility(false);
        dec_wetlands_legend = "";
    } else {
        dec_wetlands.setVisibility(true);
        dec_wetlands_legend = "<br>DEC Wetlands&nbsp;<img alt='' src='http://www.opengeohost.com:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&amp;FORMAT=image/png&amp;WIDTH=16&amp;HEIGHT=16&amp;TRANSPARENT=true&amp;LAYER=stlawrence:dec_wetlands' align='top'>";
    }
}

function toggle_soils() {
    if (soils.getVisibility() === true) {
        soils.setVisibility(false);
        soils_legend = "";
    } else {
        soils.setVisibility(true);
        soils_legend = "<br>Soils&nbsp;<img alt='' src='http://www.opengeohost.com:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&amp;FORMAT=image/png&amp;WIDTH=16&amp;HEIGHT=16&amp;TRANSPARENT=true&amp;LAYER=stlawrence:soils' align='top'>";
    }
}

function toggle_parcels2009() {
    if (parcels2009.getVisibility() === true) {
        parcels2009.setVisibility(false);
        parcels2009_legend = "";
    } else {
        parcels2009.setVisibility(true);
        parcels2009_legend = "<br>2009 Tax Parcels&nbsp;<img alt='' src='http://www.opengeohost.com:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&amp;FORMAT=image/png&amp;WIDTH=16&amp;HEIGHT=16&amp;TRANSPARENT=true&amp;LAYER=stlawrence:parcels2009' align='top'>";
    }
}

function toggle_parcels() {
    if (parcels.getVisibility() === true) {
        parcels.setVisibility(false);
        parcels_legend = "";
    } else {
        parcels.setVisibility(true);
        parcels_legend = "<br>2010 Tax Parcels&nbsp;<img alt='' src='http://www.opengeohost.com:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&amp;FORMAT=image/png&amp;WIDTH=16&amp;HEIGHT=16&amp;TRANSPARENT=true&amp;LAYER=stlawrence:parcels2010' align='top'>";
    }
}

function highlightWMS(printkey) {
    filter = "PRINTKEY = '" + printkey + "'";
    var filterParams = {
        cql_filter: filter
    };

    parcelsHighlight.mergeNewParams(filterParams);
    parcelsHighlight.setVisibility(true);

}

function unhighlightWMS() {
    parcelsHighlight.setVisibility(false);
}
